Как убить только если процесс запущен?

14

В настоящее время я использую такую ​​строку в моем файле сценария sh:

kill `ps aux | grep -F 'myServer' | grep -v -F 'grep' | awk '{ print $2 }'` 

Но мне интересно, как это назвать, только если процесс ( myServerздесь) запущен?

myWallJSON
источник
Невозможно вызвать killтолько, когда процесс запущен, потому что между тестом и вызовом есть условие состязания kill(возможно, процесс остановился по другой причине за это короткое время). Вы должны использовать pkillили killallделать то же самое, что вы пытаетесь сделать, но с меньшим количеством для ввода (и, вероятно, некоторые другие преимущества).
JanC

Ответы:

20

Я обычно просто использую pgrep и pkill

if pgrep myServer; then pkill myServer; fi
boutch55555
источник
7
Почему нет pkill myServerили killall -q myServer? Там нет недостатка в попытке убить несуществующие процессы.
Дэвид Фёрстер
12
Он не будет выходить из 0, если нет процесса для уничтожения, поэтому он может нарушать работу сценариев.
boutch55555
6
Добавить || trueтогда.
Дэвид Фёрстер
Да, но у вас не будет возможности добавить еще одно, чтобы сообщить, что процесс уже мертв.
boutch55555
Как насчет if ! killall -q myServer; then echo ERROR; fi?
Дэвид Фёрстер
9

Вы можете убить процессы по имени, используя pkillили killall, проверив их справочные страницы.

enzotib
источник
да, в отличие от killэтого, это убивает только если процесс запущен. Напримерpkill -u myuser -f myprocess\.[0-9]+
Чейз Т.
6

Немного другой подход был бы примерно таким:

killall PROCESS || echo "Process was not running."

Это позволит избежать 1возврата кода ошибки из killallкоманды, если процесс не существует. echoЧасть будет только в действие, если killallвозвращается 1, в то время как сам вернется 0(успех).

codepleb
источник
5
Использование killall -qлучше
Анвар
1
Предупреждение, killall -qподдерживается не всеми версиями Unix, MacOS Catalina все еще не имеет его.
Tresf
0

попробуйте использовать:

sudo kill `pidof process_name`

где имя_процесса - это имя процесса, который вы хотите уничтожить. Что в этом хорошего, так это то, что pidof будет перечислять pid всех процессов, соответствующих данному имени. Поскольку kill принимает несколько PID, он будет убивать всех из них в один каприз.

Позвольте мне знать, если это помогает.

amandion
источник
Что делать, если список пуст? (моя главная мысль была вообще не вызывать kill, если это возможно)
myWallJSON
1
Если список пуст, команда kill вернет код ошибки 1 и ничего не уничтожит. Это было бы эквивалентно попытке вызвать kill без аргументов. Вы можете добавить оператор if, который сначала проверяет, возвращает ли pidof пустой список. Если он не возвращает пустой список, звоните kill `pidof process_name. Если он возвращает пустой список, пропустите вызов kill.
Амандион
0

Небольшой сценарий, который я создал с R & D. надеюсь тебе понравится

#!/bin/bash

echo " Enter the process name:"
read $proc_name
if pgrep $proc_name
then
echo " $proc_name running "
pkill $proc_name
echo "$proc_name  got killed"
else
echo " $proc_name is not running/stopped "
fi

сохраните его с таким именем, как script.sh, затем

chmod +x script.sh
./script.sh

Затем дайте имя вашему процессу.

Примечание: я пробовал много раз с этим, и это нормально.

rɑːdʒɑ
источник
Могу ли я узнать, что не так с этим сценарием, и, пожалуйста, объясните, пожалуйста.
rɑːdʒɑ
Ничего плохого в этом сценарии ... +1
WinEunuuchs2Unix
0

Проверьте, существует ли процесс с pidof. Если это так, убейте его:

(! pidof process_name) || sudo kill -9 $(pidof process_name)

Код выхода всегда равен 0 после выполнения вышеуказанной команды.

Юусо Охтонен
источник
0

Использовать pkillс опцией-f

pkill -f myServer

Параметр -f- это шаблон, который обычно сопоставляется с именем процесса.

Чейз Т.
источник
-1

Я хотел бы использовать:

ps x --no-header -o pid,cmd | awk '!/awk/&&/myServer/{print $1}' | xargs -r kill

xargs -rГоворит бежать убивать только при наличии входного сигнала. ps --no-header -eo pid,cmdПолучает выход в лучший формат для анализа.

Arcege
источник