@Jayan: это также довольно неизбирательное убийство. Это удивительно легко неправильно ...
Thkala
1
@Jayan: ты не будешь убеждать меня :-). Меня слишком много раз сжигали сторонние скрипты, которые настаивали на использовании pkill- самая распространенная ошибка - предположение, что в любой момент времени может существовать только один экземпляр каждого двоичного файла.
Thkala
4
Для всех пользователей Mac, которые находят этот ответ, как и я, эквивалент для Mac есть killall -m my_pattern.
Зев Эйзенберг,
1
Если у вас есть несколько зависающих процессов, которые не будут убиты, используйте pkill -f -9, чтобы безжалостно убить их
MacK
18
Я рекомендую использовать pgrepсначала, чтобы проверить, что вы собираетесь убить. Вы можете использовать, pgrep -lчтобы увидеть имена процессов или pgrep -aувидеть полные командные строки. Он использует те же флаги, что и pkill. Так что в этом случае вы могли бы использовать pgrep -fa my_pattern.
Studgeek
158
Убить все процессы, соответствующие строке «myProcessName»:
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 не выполнял команду, если аргументы не указаны.
Epigene
2
Просто небольшая модификация, возможно, лучше процитировать имя процесса: ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9 без кавычек только один из моих фоновых процессов был убит при первом запуске. Запуск его снова убил остальных.
Али Хайдер
-rОпция не существует в OS X, так что кажется.
Даниэль
52
Если вам нужно больше гибкости в выборе процессов, используйте
-1 Вам не нужен цикл, вы можете просто kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`(обратите внимание также на рефакторинг; см. Также мой комментарий к ответу @ synthesizerpatel).
tripleee
11
@tripleee Нет проблем с downvote, но вы делаете Осознайте, что OQ был «Я хочу , чтобы убить все процессы , которые я получаю от: пс Окс | Grep my_pattern» , который я dutyfully согласился.
Евгений Рик,
Kill убьет все процессы за один раз, для этого вам не нужен цикл. Если psвозвращает три процесса 123, 234 и 345, вы можете kill 123 234 345точно так же, как вы можете rmили catнесколько аргументов файла.
tripleee
@tripleee Я собираюсь удалитьgrep
Eugen Rieck
for KILLPID in пс топор | греп "пума" | grep -v 'grep' | awk '{print $ 1;}' ; do kill -9 $KILLPID; doneудалит grep
Джастин Э.
18
Вы можете использовать следующую команду, чтобы перечислить процесс
ps aux | grep -c myProcessName
если вам нужно проверить счет этого процесса, запустите
Вы можете использовать следующую команду для отображения процесса ps aux | grep -c myProcessName, если вам нужно проверить счетчик этого процесса, запустите ps aux | grep -c myProcessName | grep -v grep, после которого вы можете завершить процесс, используя kill -9 $ (ps aux | grep -e myProcessName | awk '{print $ 2}')
Nived Thanima
13
Также вы можете использовать killall -r my_pattern. -rИнтерпретировать шаблон имени процесса как расширенное регулярное выражение.
Если вы считаете, что pkill -f PATTERNэто слишком опасно, я написал ezkill bash-скрипт, который предлагает вам выбрать, какие процессы из тех, которые соответствуют ШАБЛОНУ, вы хотите уничтожить.
Если вы не хотите испытывать головную боль при поиске идентификатора процесса, используйте regexp для уничтожения процесса по имени. Например, чтобы убить Chrome, следующий код сделает свое дело.
Добро пожаловать в StackOverflow. Пожалуйста, используйте отступы 4 пробела или табуляции для строк кода, чтобы они были отформатированы как блоки кода. С наилучшими пожеланиями
это лучше и безопаснее использовать 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 не работал с моим регулярным выражением.
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа.
my_pattern
просто подстрока имени, или она содержит какие-либо специальные символы регулярных выражений?Ответы:
Использование
pkill -f
, которое соответствует шаблону для любой части командной строкиисточник
pkill
- самая распространенная ошибка - предположение, что в любой момент времени может существовать только один экземпляр каждого двоичного файла.killall -m my_pattern
.pgrep
сначала, чтобы проверить, что вы собираетесь убить. Вы можете использовать,pgrep -l
чтобы увидеть имена процессов илиpgrep -a
увидеть полные командные строки. Он использует те же флаги, что и pkill. Так что в этом случае вы могли бы использоватьpgrep -fa my_pattern
.Убить все процессы, соответствующие строке «myProcessName»:
Источник: http://www.commandlinefu.com/commands/view/1138/ps-ef-grep-process-grep-v-grep-awk-print-2-xargs-kill-9
Что делает этот код?
ps -ef
Выдает список идентификатора процесса на компьютере видимого для пользователя. Инструмент труба grep фильтрует это для строк, содержащих эту строку.grep -v grep
Говорит не совпадают на самом процессе , делающего оглавлению. Канал awk print говорит, что разделяет строки в пробелах по умолчанию и фильтрует их во второй столбец, который является нашим идентификатором процесса. Канал xargs запускает новый процесс для отправки всех этих pidkill -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, так что кажется.Если вам нужно больше гибкости в выборе процессов, используйте
Вы можете использовать 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Вы можете использовать следующую команду, чтобы перечислить процесс
если вам нужно проверить счет этого процесса, запустите
после чего вы можете убить процесс, используя
источник
Также вы можете использовать
killall -r my_pattern
.-r
Интерпретировать шаблон имени процесса как расширенное регулярное выражение.источник
Если вы считаете, что
pkill -f PATTERN
это слишком опасно, я написал ezkill bash-скрипт, который предлагает вам выбрать, какие процессы из тех, которые соответствуют ШАБЛОНУ, вы хотите уничтожить.источник
Вы можете использовать следующую команду для
источник
Если вы не хотите испытывать головную боль при поиске идентификатора процесса, используйте regexp для уничтожения процесса по имени. Например, чтобы убить Chrome, следующий код сделает свое дело.
killall -r --regexp chrome
источник
-r
или--regexp
, которые являются коротким и GNU длинным вариантом, соответственно.Вы можете использовать следующую команду для:
или
Меня устраивает.
источник
Звучит плохо?
пример:
источник
Нашел лучший способ сделать это для сервера, который не поддерживает
pkill
Вы не должны зацикливаться.
источник
это лучше и безопаснее использовать
pgrep -f
сkill
, или простоpkill -f
,grep
ИНГps
выход «s может пойти не так.В отличие от использования,
ps | grep
с которым вам нужно отфильтровать строку grep путем добавления| grep -v
или использования трюков шаблонов,pgrep
просто не выберете сам по себе.Более того, если ваш шаблон появится в
ps
'sUID
/USER
,SDATE
/START
или любом другом столбце, вы получите нежелательные процессы в выводе и убьете их,pgrep
+pkill
не страдайте этим недостатком.также я обнаружил, что
killall -r
/-regexp
не работал с моим регулярным выражением.pkill -f "^python3 path/to/my_script$"
man pkill
источник
Я взял ответ Евгения Рика и работал с ним. Мой код добавляет следующее:
ps ax
включает в себя grep, поэтому я исключил егоgrep -Eiv 'grep'
Я создал файл, назвал его
killserver
, вот оно:Результаты
источник
Это способ:
источник