Как преобразовать несколько строк в одну строку в bash stdout? - PullRequest
5 голосов
/ 08 февраля 2010

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

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

$ kill -9 2681 2685 2689 4645

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

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

Ответы [ 6 ]

11 голосов
/ 08 февраля 2010

Простой способ сделать это - использовать xargs

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

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

6 голосов
/ 08 февраля 2010
    killall -9 firefox 
2 голосов
/ 09 февраля 2010

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

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

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

2 голосов
/ 09 февраля 2010

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

ps -eo pid,args | awk 'BEGIN{s="kill -9 "}$2~/bash/{s=s" "$1} END{system(s)}'
2 голосов
/ 08 февраля 2010

Используйте взамен 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 * 1 022 *]

2 голосов
/ 08 февраля 2010
pids=""
for pid in $(ps aux | grep firefox | awk '{print $2}')
do
pids=" $pid"
done
kill -9 $pids
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...