Рейтинг:0

Как убить 3 процесса с совершенно разными именами?

флаг in

Я хочу убить 3 процесса со всеми разными именами, вообще ничего общего. Как мне это сделать? grep не может захватить их все, потому что нет ничего общего, или есть способ заставить его захватить их все?

Nmath avatar
флаг ng
Трудно ответить на вопрос без подробностей. Для начала вы можете рассказать нам о процессах и почему вы не можете просто запустить три команды.
guiverc avatar
флаг cn
Kill позволяет указать несколько PID; см. `man kill` для страницы справочного руководства.
Quasímodo avatar
флаг jp
-1 Я действительно не понимаю этого. Даже если каждая команда, которая может убить, может убить только один процесс, все, что вам нужно сделать, это ввести команду три раза, верно?
Рейтинг:8
флаг fr

Пример для убийства гном-диски и гном-системный монитор.

kill $(pidof gnome-disks gnome-system-monitor)

Я уверен, что у нас это уже есть в той или иной форме, потому что кто-то здесь, должно быть, сказал мне что-то подобное много лет назад.

Можно сделать красивее, но сложнее вот так:

# Укажите разделенный пробелами список имен программ, которые нужно убить
programs_to_kill="gnome-диски gnome-система-монитор"
убить $(pidof $programs_to_kill)
melvio avatar
флаг cn
Проголосовал. @dawnslayer Предлагаю отметить это как принятый ответ. Это решение будет лучшим подходом для большинства людей.
Рейтинг:4
флаг cn

Если вы действительно хотите использовать Греппинг, ты можешь использовать убить чтобы получить идентификаторы процессов (pids). убить грепсы для некоторого шаблона в именах процессов и убивает найденные процессы.

Синтаксис, который вы можете использовать:

pkill 'имя_процесса1|другой_процесс|что-то_еще'

Ты можешь использовать pgrep (процесс grep), чтобы проверить, что вы собираетесь убить убить.
Синтаксис очень похож:

pgrep -l 'имя_процесса1|другой_процесс|что-то_еще'

Например, если я запускаю на своей машине следующую команду, я получаю список совпадений с их pidс:

$ pgrep -l 'clamd|dockerd|snapd'
1952 г.
1989 моллюск
2085 докерд
2813 докерд

Предупреждение: Если вы действительно знаете полные имена процессов, используйте LiveWireBTответ:

убить $(pidof имя_процесса1 другие_процессы)

Туда, ssh-агент и sshd не будет жертвой, когда вы бежите убить ssh и не обратил внимания на то, что pgrep -l ssh сказал.

melvio avatar
флаг cn
Обратите внимание, что лично я бы использовал ответ @LiveWireBT. Grepping может быть сложным, и вы можете убить слишком мало процессов или, что еще хуже, слишком много процессов. Однако, поскольку вы упомянули grep, я добавил этот ответ, чтобы предоставить вам функциональность.
Peter Cordes avatar
флаг fr
Можете ли вы закрепить шаблоны с помощью `^foo$|^bar$` или чего-то еще, чтобы заставить их соответствовать полному имени процесса, а не просто подстрокам, которые легко могут совпадать слишком много? Или параметр pkill/pgrep, требующий полных совпадений, таких как `grep -x`?
melvio avatar
флаг cn
Комментарий @PeterCordes показывает именно проблему с grep; это более рискованно, чем необходимо, если вы уже знаете полные имена. Если вы знаете полные имена процессов, которые необходимо убить, я бы даже не стал заморачиваться с `-x` или `^имя-процесса$`. Вместо этого я бы использовал решение @LiveWireBT. Используйте это только в том случае, если вы хотите объединить функциональность `grep`+`kill`.
Peter Cordes avatar
флаг fr
Да, конечно, но если вы вообще хотите написать о grep, вы можете конкретно указать, каковы риски и что делает его менее удобным для безопасного использования.
melvio avatar
флаг cn
Я согласен с @PeterCordes. Я добавил **предупреждение**. Я также рад принять дополнительные правки, объясняющие компромиссы/риски/предостережения.
Рейтинг:2
флаг my
killall name1 && killall name2 && killall name3
LiveWireBT avatar
флаг fr
Анекдот: несколько лет назад на работе нам приходилось отслеживать java-приложения и при необходимости перезапускать их. Поэтому я использовал killall для уничтожения процессов, и это было нормально. Я перезапустил их, как в документации, которая у нас была. Все в порядке. До следующего дня (или еще несколько дней), когда служба поддержки второго уровня не спросила, как я убивал процессы, потому что java-приложение, которое должно отслеживать процессы, «умерло» и больше не возвращалось. Однако этого приложения не было в нашей документации. Какие глупости люди делают. :-) (Плохое понимание платформы приложения, плохая документация.)
LiveWireBT avatar
флаг fr
Привет, новый участник. Пожалуйста, дайте полный ответ. Может быть интересно, почему вы решили прервать, если первая команда kill не удалась, что и делает цепочка команд вместе с `&&` в bash.
bac0n avatar
флаг cn
`killall имя1 имя2 имя3` подойдет.
Рейтинг:-1
флаг us

Предполагая, что вы можете выбрать три процесса по имени, мое решение будет таким:

убить `ps awx| grep -E '((ProcessNameA)|(ProcessNameB)|(ProcessNameC))' |grep -v grep| sed "s/ .*$//"`
LiveWireBT avatar
флаг fr
A well known hack to avoid `grep 'pattern' | grep -v grep` is to use `grep '[p]attern'`. :-)
LiveWireBT avatar
флаг fr
It probably gets the job done, but you should study more manpages of the tools available. I built similar things years ago which coworkers were afraid to touch. I know when I mangle too much through grep and sed, then I should take a look at awk or rethink the whole thing. shellcheck is a useful tool. Googles Shell Style Guide is also worth a read.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.