Как уничтожить процесс в сценарии оболочки, который пробегает крон?

По умолчанию, ps не покажет параметры, с которыми назвали программу. Опции -f и -l оба покажут полный вызов.

ps -fu username

приведет к выводу, который похож:

username 23464 66.7  0.0  11400   628 pts/5    R    15:28   1:40 bash script.sh
5
29.07.2014, 16:06
3 ответа

Вы должны указать, что убивать:

kill -9 $(ps | grep "server1" | grep -v grep | awk '{ print $1 }')

Вы также можете использовать трюк:

kill -9 $(ps | grep "server[1]" | awk '{ print $1 }')
4
27.01.2020, 20:36

В чистейшей форме можно использовать

pkill server1

Это предполагает, что server1 на самом деле имя процесса, а не где-то в командной строке - в противном случае добавьте -f .

pkill -f server1CommandArgument


Но подождите!

Вы можете проверить, что pkill будет соответствовать и уничтожить, с помощью команды pgrep - что технически почти то же самое. Разница в том, что вместо уничтожения он печатает PID .

Попробуйте это - перечислите соответствующие PID:

pgrep server1

-l также перечисляет имя процесса , а не только PID:

pgrep -l server1

-f соответствует командной строке , а не только имени:

pgrep -fl server1

Если вы хотите убить процессы, которые соответствуют pgrep , оставьте -l и добавьте сигнал, если вы хотите что-то другое, кроме SIGTERM по умолчанию, -15 :

pkill -9 server1

В вашем примере используется простая команда ps , которая по умолчанию соответствует только процессам на текущем терминале, позаботьтесь о том, что соответствует вашей команде, поскольку pgrep и pkill не соответствуют только процессы на текущем терминале.


Замечание об использовании kill -9 - это самый жестокий способ убить ; Вы уверены, что действительно нужен ?

Это может не иметь значения, в зависимости от того, какая программа убита. Но вы не должны делать это без уважительной причины для программы / сервера, которая может сохранять любые данные, файлы, записывать файлы блокировки и т. Д. Пока программа не зависает плохо, kill с использованием значения по умолчанию signal -15 подойдет.

4
27.01.2020, 20:36

Внутри сценария оболочки вы также должны пропустить sh . Команда ниже работала для меня.

ps -aef | grep $1 | grep -v sh| grep -v grep| awk '{print $2}'

Сценарий:

#!/bin/bash
var=`ps -aef | grep $1 | grep -v sh| grep -v grep| awk '{print $2}'`
if [ !-z "$var"]
then
  echo $1 process is not running 
else
  kill -9 $var
  echo $1 process killed forcefully, process id $var.
fi

Ссылка: Принудительное уничтожение процесса Linux в сценарии оболочки можно просмотреть в статье для полного объяснения.

0
27.01.2020, 20:36

Теги

Похожие вопросы