Как преобразовать, несколько выравнивают в одну строку в ударе stdout?

Я иногда делаю это в своей оболочке:

sam@sam-laptop:~/shell$ ps aux | grep firefox | awk '{print $2}'
2681
2685
2689
4645

$ kill -9 2681 2685 2689 4645

Существует ли способ, которым я могу преобразовать несколько строк, содержащих PIDs в одну строку, разделенную пробелами? (Это является немного раздражающим для ввода PIDs каждый раз, когда и я действительно хотел бы учиться :))

Большое спасибо.

5
задан Zenet 13 March 2010 в 21:50
поделиться

6 ответов

Для этого проще всего использовать xargs

ps aux | grep firefox | awk '{print $2}' | xargs kill -9

. Это вызовет команду kill со всеми pid-идентификаторами одновременно. (Именно то, что вы хотите)

11
ответ дан 18 December 2019 в 06:22
поделиться
    killall -9 firefox 
6
ответ дан 18 December 2019 в 06:22
поделиться
pids=""
for pid in $(ps aux | grep firefox | awk '{print $2}')
do
pids=" $pid"
done
kill -9 $pids
2
ответ дан 18 December 2019 в 06:22
поделиться

вы можете сделать это просто с помощью awk

ps -eo pid,args | awk 'BEGIN{s="kill -9 "}$2~/bash/{s=s" "$1} END{system(s)}'
2
ответ дан 18 December 2019 в 06:22
поделиться

Я согласен со всеми остальными ответами об использовании pkill, но, ... и вместо использования xargs, ... вы можете подключить его к tr:

kill $(ps aux | grep [f]irefox | awk '{print $2}' | tr '\n' ' ')

Также подумайте об использовании [f], чтобы не совпадать с самим процессом grep.

2
ответ дан 18 December 2019 в 06:22
поделиться

Используйте вместо него pkill . Также есть файл pgrep.

Это сделает то, что вы хотите, и насколько проще вы можете получить?

pkill firefox

Использование опции -9 для pkill будет тем, чем вы сейчас занимаетесь; однако избегайте SIGKILL:

Не используйте этот сигнал легкомысленно. У процесса не будет никаких шансов навести порядок. Он может оставить после себя потерянные дочерние процессы, временные файлы, выделенные блокировки, активные сегменты разделяемой памяти, занятые сокеты и любое количество других несоответствий состояния ресурсов. Это может привести к неожиданным и трудным для отладки проблемам в последующей работе системы. [ wlug.org ]

И:

Кстати, это одна из причин, по которой вам не следует регулярно использовать SIGKILL. SIGKILL следует использовать только тогда, когда процесс завис и не может быть уничтожен другим способом. Если вы используете SIGTERM или SIGINT в скрипте python, вы увидите, что mplayer БУДЕТ оставить терминал в состоянии USABLE. Если вы регулярно используете программы SIGKILL, у вас нет возможности что-либо очистить, и в некоторых ситуациях это может отрицательно повлиять на всю вашу систему.

SIGTERM - это сигнал по умолчанию, отправляемый командой kill shell. SIGINT - это сигнал, отправляемый из прерывания терминала (control-C). [ debian.org ]

2
ответ дан 18 December 2019 в 06:22
поделиться