Предположим, у меня есть тысяча или более экземпляров любого viзапущенного процесса (например, ). Как убить их всех одним выстрелом / одной строкой / одной командой?
Предположим, у меня есть тысяча или более экземпляров любого viзапущенного процесса (например, ). Как убить их всех одним выстрелом / одной строкой / одной командой?
Ответы:
Что не так со старым добрым,
for pid in $(ps -ef | grep "some search" | awk '{print $2}'); do kill -9 $pid; done
Есть способы сделать это более эффективным,
for pid in $(ps -ef | awk '/some search/ {print $2}'); do kill -9 $pid; done
и другие варианты, но на базовом уровне, это всегда работало для меня.
echo kill -9 $pidпервый, так что я знаю, что получаю. Я не уверен, что у AIX есть pkillмой хлеб с маслом UNIX. И действительно ли это достаточно плохо, чтобы за него проголосовали - странно.
csh
Используйте killall,
killall vi
Это убьет все команды с именем 'vi'
Вы также можете добавить сигнал, например, SIGKILL
killall -9 vi
killall -9 vi
killallделает именно то, что предлагает название ... это убивает процесс init.
pkillэто то, что я рекомендую, если оно доступно ( Linux , FreeBSD , NetBSD , OpenBSD , Solaris ). Вы можете указать процессы по имени команды, по полной командной строке или другим критериям. Например, pkill viубивает все программы, имя команды которых содержит подстроку vi. Чтобы убить только вызванные процессы vi, используйте pkill -x vi. Чтобы убить только процессы, вызванные viс последним аргументом, оканчивающимся на .conf, используйте pkill -fx 'vi.*\.conf'.
Чтобы увидеть список идентификаторов PID, которые pkillбудут отправлять сигнал, используйте pgrep, который имеет точно такой же синтаксис, за исключением того, что он не принимает имя или номер сигнала. Чтобы увидеть больше информации об этих процессах, запустите
ps -p "$(pgrep …)"
Под Linux вам нужно ps -p $(pgrep -d, …)вместо этого (это ошибка: Linux psне POSIX-совместимый).
Другим распространенным способом идентификации процессов для уничтожения являются процессы, у которых открыт определенный файл (который может быть исполняемым файлом процесса). Вы можете перечислить их с помощью fuser; используйте, fuser -kчтобы отправить им сигнал. Например, fuser -k /usr/bin/findубивает все текущие события find.
Если есть запущенный процесс, который продолжает разветвляться, вам может потребоваться убить всю группу процессов сразу. Группа процессов идентифицируется негативом своего лидера, который является предком процесса всех процессов в группе. Чтобы увидеть группу процессов, к которой принадлежит процесс, запустите ps -o pgid(плюс любую опцию, чтобы выбрать, какой процесс (ы) отображать). Если вы решили , что вы хотите , чтобы убить лидера 1234 группы процессов и всех его потомков, запускать kill -1234или kill -HUP -1234или любой другой сигнал.
Если вы не можете найти лучший способ, используйте psсоответствующие параметры, чтобы вывести список всех процессов и отфильтровать его с помощью grepкакой-либо другой команды фильтрации текста. Будьте внимательны, чтобы случайно не сопоставить другие процессы, которые запускают команду с похожим именем или с аргументом, содержащим это имя. Например:
kill $(ps -o pid -o comm | awk '$2 == "vi" {print $1}')
Помните, что ваша grepили awkкоманда может быть указана в psвыходных данных ( psи команда фильтрации запускается параллельно, поэтому, будет ли она отображаться или нет, зависит от времени). Это особенно важно, если аргументы команды включены в psвывод.
pkillздесь очень хорошо Вы можете дать ему много параметров для уточнения шаблона.
pkillдоступен для Linux, BSD и Solaris - afaik. Так что это имеет больший спрэд, чем killall.
Самый простой способ сделать это - сначала проверить, что вы получаете правильные идентификаторы процессов с помощью:
pgrep -f [part_of_a_command]
Если результат соответствует ожиданиям. Идти с:
pkill -f [part_of_a_command]
pgrep -f "command name"
Интересно, никто не упомянул этот. pidof выводит разделенные пробелами pids процессов, соответствующих переданному имени процесса. Таким образом, вы можете напрямую использовать его вывод killбез обвязки. На Arch Linux я использую
kill -9 $(pidof <proc name>)
Недостатком этого решения является то, что оно не позволяет использовать регулярные выражения.
Я бы предложил вам попробовать pkill.
Пример: ps -ef | pkill -f command
Чтобы показать список всех процессов, которые нужно убить, сначала попробуйте pgrep:
Пример: ps -ef | pgrep -f command
ps -efв pkillили pgrep? Эти команды не читают со стандартного ввода.
$ ps -eaf | grep "xyz" | grep -v grep | awk 'print $2' | xargs kill
ps -ef | pgrep -f "search" | xargs kill -9
pkillизprocpsпакета.