По умолчанию, ps
не покажет параметры, с которыми назвали программу. Опции -f
и -l
оба покажут полный вызов.
ps -fu username
приведет к выводу, который похож:
username 23464 66.7 0.0 11400 628 pts/5 R 15:28 1:40 bash script.sh
Вы должны указать, что убивать:
kill -9 $(ps | grep "server1" | grep -v grep | awk '{ print $1 }')
Вы также можете использовать трюк:
kill -9 $(ps | grep "server[1]" | awk '{ print $1 }')
В чистейшей форме можно использовать
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
подойдет.
Внутри сценария оболочки вы также должны пропустить 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 в сценарии оболочки можно просмотреть в статье для полного объяснения.