Я хочу убить все процессы, которые получаю:
ps aux | grep my_pattern
Как это сделать?
Это не работает:
pkill my_pattern
Я хочу убить все процессы, которые получаю:
ps aux | grep my_pattern
Как это сделать?
Это не работает:
pkill my_pattern
Используйте pkill -f
, который соответствует шаблону для любой части командной строки
pkill -f my_pattern
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
Что делает этот код?
ps -ef
создает список идентификаторов процесса на компьютере, видимом для этого пользователя. Инструмент труба grep фильтрует это для строк, содержащих эту строку. grep -v grep
говорит, что не совпадает с процессом, выполняющим поиск. Канал awk print говорит, что разделяет строки в пробелах по умолчанию и фильтрует их во второй столбец, который является нашим идентификатором процесса. Канал xargs запускает новый процесс, чтобы отправить все эти pid, чтобы kill -9
, завершив их все.
Код выше плохой, опасный, безобразный и хакерский по нескольким причинам.
Если принудительно завершающий код выполняет какие-либо операции с базами данных или защищенные транзакции с малой вероятностью состязания, то через некоторое время атомарность этой транзакции будет нарушена, что приведет к неопределенному поведению. убить -9 не берет пленных. Если ваш код чувствителен к этому, попробуйте заменить xargs kill
передаваемым флагом, который запрашивает xargs kill
завершение работы, и только если этот запрос отклонен, в крайнем случае kill -9
Существует ненулевая вероятность того, что вы случайно завершите работу операционной системы или вызвали неопределенное поведение в несвязанном процессе, что приведет к нестабильности всей системы, потому что ps -ef
перечисляет все возможные процессы, которые могут существовать, и вы не можете быть уверены, что какой-то странный третий Библиотека party публикует имя вашего процесса или то, что в промежутке между чтением и выполнением kill -9 процесс изменился на что-то другое, и теперь вы случайно завершили какой-то случайный процесс, который вы не собирались.
Но если вы понимаете риски и контролируете их с очень уникальными именами, и у вас все в порядке с несколькими сброшенными транзакциями или случайным повреждением данных, то в 99,9% случаев все будет в порядке. Если возникла проблема, перезагрузите компьютер, убедитесь, что нет конфликтов процессов. Именно из-за кода, подобного этому, сценарий технической поддержки: "Вы пытались перезагрузить компьютер" мем 5-го уровня.
Если вам нужна большая гибкость при выборе процессов, используйте
for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do
kill -9 $KILLPID;
done
Вы можете использовать grep -e и т.д.
вы можете использовать следующую команду для перечисления процесса
ps aux | grep -c myProcessName
если вам нужно проверить счетчик этого процесса, запустите
ps aux | grep -c myProcessName |grep -v grep
после чего вы можете убить процесс, используя
kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }')
Также вы можете использовать killall -r my_pattern
. -r
Интерпретировать шаблон имени процесса как расширенное регулярное выражение.
killall -r my_pattern
Если вы pkill -f PATTERN
слишком опасен, я написал ezkill bash-скрипт, который предложит вам выбрать, какие процессы среди тех, которые соответствуют PATTERN, вы хотите уничтожить.
Вы можете использовать следующую команду для
kill -9 $(ps aux | grep 'process' | grep -v 'grep' | awk '{print $2}')
Если вы не хотите испытывать головную боль при поиске идентификатора процесса, используйте regexp для уничтожения процесса по имени. Например, чтобы убить Chrome, следующий код сделает свое дело.
killall -r --regexp chrome
Вы можете использовать следующую команду для:
ps -ef | grep -i myprocess | awk {'print $2'} | xargs kill -9
или
ps -aux | grep -i myprocess | awk {'print $2'} | xargs kill -9
Это работает для меня.
Звучит плохо?
pkill `pidof myprocess`
Пример:
# kill all java processes
pkill `pidof java`
это лучше и безопаснее использовать pgrep -f
с kill
или просто pkill -f
, grep
Инг ps
выход может пойти не так.
В отличие от использования ps | grep
ps | grep
с помощью которого вам нужно отфильтровать строку grep, добавив | grep -v
| grep -v
или используя трюки с шаблонами, pgrep
просто не выберет сам себя.
Более того, если ваш шаблон появится в ps
UID
/USER
, SDATE
/START
или любом другом столбце, вы получите нежелательные процессы в выводе и убьете их, pgrep
+ pkill
не страдает от этого недостатка.
Также я обнаружил, что killall -r
/ -regexp
не работал с моим регулярным выражением.
pkill -f "^python3 path/to/my_script$"
Нашел лучший способ сделать это для сервера, который не поддерживает ' pkill '
" kill -9 $ (ps ax | grep My_pattern | fgrep -v grep | awk '{print $ 1}') "
Вы не должны зацикливаться.