
Мне нужно убить процесс, который содержит myName
в своем описании. В настоящее время я делаю:
ps -ax |grep myName
I see PID
kill -9 PID
Как сделать то же самое одной командой, не вводя PID?
решение1
Если myName
это имя процесса/исполняемого файла, который вы хотите завершить, вы можете использовать:
pkill myName
pkill
по умолчанию отправляет SIGTERM
сигнал (сигнал 15). Если вам нужен SIGKILL
или сигнал 9, используйте:
pkill -9 myName
Если myName
это не имя процесса или, например, это аргумент другой (длинной) команды, pkill
(или pgrep
) может работать не так, как ожидается. Поэтому вам нужно использовать опцию -f
.
От man kill
:
-f, --full
The pattern is normally only matched against the process name.
When -f is set, the full command line is used.
NOTES
The process name used for matching is limited to the 15 characters present
in the output of /proc/pid/stat. Use the -f option to match against the
complete command line, /proc/pid/cmdline.
Так:
pkill -f myName
или
kill -9 $(pgrep -f myName)
решение2
С именем команды используйте:
pkill -9 myscript
Если вы ищете строку в командной строке:
kill -9 $(ps ax | grep myName | fgrep -v grep | awk '{ print $1 }')
Должен вас предупредить: указанная выше команда может отправить SIGKILL
сигнал более чем одному процессу.
решение3
Есть две очень удобные команды pgrep
, pkill
которые позволяют ввести поисковый запрос или часть имени команды, и они либо предоставят PID процесса, либо (в случае pkill
) завершат этот процесс.
$ pgrep -f firefox
23699
Выполнение той же команды с pkill
флагом -f
и закроет все окна Firefox.
Флаг -f
необходим специально для поиска по всей командной строке процесса.
решение4
Вы можете выполнить простую операцию for loop
по всем PID, связанным с определенным именем процесса, например так:
$ for i in $( ps ax | awk '/[m]yName/ {print $1}' ); do kill ${i}; done
Это завершит все процессы, содержащие слово: myName
.