Ответы:
Использование pkill -f
, которое соответствует шаблону для любой части командной строки
pkill -f my_pattern
pkill
- самая распространенная ошибка - предположение, что в любой момент времени может существовать только один экземпляр каждого двоичного файла.
killall -m my_pattern
.
pgrep
сначала, чтобы проверить, что вы собираетесь убить. Вы можете использовать, pgrep -l
чтобы увидеть имена процессов или pgrep -a
увидеть полные командные строки. Он использует те же флаги, что и pkill. Так что в этом случае вы могли бы использовать pgrep -fa 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
деталь переданным флагом, который запрашивает постепенное отключение, и только в случае отказа в этом, в крайнем случаеkill -9
Существует ненулевая вероятность того, что вы случайно завершите работу операционной системы или вызовете неопределенное поведение в несвязанном процессе, что приведет к нестабильности всей системы, поскольку ps -ef
перечисляет все возможные процессы, которые могут существовать, и вы не можете быть уверены, что какая-то странная сторонняя библиотека делит вашу имя процесса или то, что в промежутке между чтением и выполнением kill -9, processid изменился на что-то другое, и теперь вы случайно закончили какой-то случайный процесс, который вы не собирались.
Но если вы понимаете риски и контролируете их с очень уникальными именами, и у вас все в порядке с несколькими сброшенными транзакциями или случайным повреждением данных, то в 99,9% случаев все будет в порядке. Если есть проблема, перезагрузите компьютер, убедитесь, что нет никаких конфликтов процессов. Именно из-за кода, подобного этому, сценарий технической поддержки: «Вы пытались перезагрузить компьютер» мем 5-го уровня.
ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9
чтобы xargs не выполнял команду, если аргументы не указаны.
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
без кавычек только один из моих фоновых процессов был убит при первом запуске. Запуск его снова убил остальных.
-r
Опция не существует в OS X, так что кажется.
Если вам нужно больше гибкости в выборе процессов, используйте
for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do
kill -9 $KILLPID;
done
Вы можете использовать grep -e и т. Д.
kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`
(обратите внимание также на рефакторинг; см. Также мой комментарий к ответу @ synthesizerpatel).
ps
возвращает три процесса 123, 234 и 345, вы можете kill 123 234 345
точно так же, как вы можете rm
или cat
несколько аргументов файла.
grep
for KILLPID in
пс топор | греп "пума" | grep -v 'grep' | awk '{print $ 1;}' ; do kill -9 $KILLPID; done
удалит grep
Вы можете использовать следующую команду, чтобы перечислить процесс
ps aux | grep -c myProcessName
если вам нужно проверить счет этого процесса, запустите
ps aux | grep -c myProcessName |grep -v grep
после чего вы можете убить процесс, используя
kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }')
Если вы не хотите испытывать головную боль при поиске идентификатора процесса, используйте regexp для уничтожения процесса по имени. Например, чтобы убить Chrome, следующий код сделает свое дело.
killall -r --regexp chrome
-r
или --regexp
, которые являются коротким и GNU длинным вариантом, соответственно.
Вы можете использовать следующую команду для:
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`
Нашел лучший способ сделать это для сервера, который не поддерживает pkill
kill -9 $(ps ax | grep My_pattern| fgrep -v grep | awk '{ print $1 }')
Вы не должны зацикливаться.
это лучше и безопаснее использовать pgrep -f
с kill
, или просто pkill -f
, grep
ИНГ ps
выход «s может пойти не так.
В отличие от использования, ps | grep
с которым вам нужно отфильтровать строку grep путем добавления | grep -v
или использования трюков шаблонов, pgrep
просто не выберете сам по себе.
Более того, если ваш шаблон появится в ps
's UID
/ USER
, SDATE
/ START
или любом другом столбце, вы получите нежелательные процессы в выводе и убьете их, pgrep
+ pkill
не страдайте этим недостатком.
также я обнаружил, что killall -r
/ -regexp
не работал с моим регулярным выражением.
pkill -f "^python3 path/to/my_script$"
Я взял ответ Евгения Рика и работал с ним. Мой код добавляет следующее:
ps ax
включает в себя grep, поэтому я исключил его grep -Eiv 'grep'
Я создал файл, назвал его killserver
, вот оно:
#!/bin/bash
PROCESS_TO_KILL=bin/node
PROCESS_LIST=`ps ax | grep -Ei ${PROCESS_TO_KILL} | grep -Eiv 'grep' | awk ' { print $1;}'`
KILLED=
for KILLPID in $PROCESS_LIST; do
if [ ! -z $KILLPID ];then
kill -9 $KILLPID
echo "Killed PID ${KILLPID}"
KILLED=yes
fi
done
if [ -z $KILLED ];then
echo "Didn't kill anything"
fi
Результаты
➜ myapp git:(master) bash killserver
Killed PID 3358
Killed PID 3382
Killed
➜ myapp git:(master) bash killserver
Didn't kill anything
my_pattern
просто подстрока имени, или она содержит какие-либо специальные символы регулярных выражений?