Предположим, у меня есть тысяча или более экземпляров любого 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
пакета.