我有时会做这在我的外壳:如何在bash stdout中将多行转换为一行?
[email protected]:~/shell$ ps aux | grep firefox | awk '{print $2}'
2681
2685
2689
4645
$ kill -9 2681 2685 2689 4645
有没有一种方法,我可以转换包含的PID的多条线路到用空格隔开一条线? (每次输入PID都有点麻烦,我真的很想知道:))
非常感谢。
我有时会做这在我的外壳:如何在bash stdout中将多行转换为一行?
[email protected]:~/shell$ ps aux | grep firefox | awk '{print $2}'
2681
2685
2689
4645
$ kill -9 2681 2685 2689 4645
有没有一种方法,我可以转换包含的PID的多条线路到用空格隔开一条线? (每次输入PID都有点麻烦,我真的很想知道:))
非常感谢。
这个最简单的方式是使用xargs的
ps aux | grep firefox | awk '{print $2}' | xargs kill -9
这将调用与在同一时间所有PID kill命令。 (正是你想要的)
pids=""
for pid in $(ps aux | grep firefox | awk '{print $2}')
do
pids=" $pid"
done
kill -9 $pids
你的意思是'pids =“$ pids $ pid”'?我不明白这是如何工作的... – 2010-02-08 19:35:29
感谢作品像一个魅力:) – Zenet 2010-02-08 19:57:04
改为使用pkill。还有一个pgrep。
这会做你想做的事情,你能得到多少简单?
pkill firefox
使用-9选项打击将是你目前的工作;但是,请避免使用SIGKILL:
请勿轻微使用此信号。这个过程不会有任何清理的机会。它可能会遗留孤儿子进程,临时文件,分配的锁,活动的共享内存段,繁忙的套接字以及任何数量的其他资源状态不一致。这会导致在系统的后续操作中出现令人惊讶和难以调试的问题。 [wlug.org]
和:
顺便说一句,这是一个原因,你不应该经常使用 SIGKILL。只有当进程被挂起并且不能以任何其他方式死亡时,才能使用SIGKILL。如果在python脚本中使用 SIGTERM或SIGINT,您将看到mplayer将使终端处于USABLE状态。如果您经常使用SIGKILL程序 ,则无法在某些情况下清理任何内容,并可能对整个系统产生不利影响。
SIGTERM是kill shell命令发送的默认信号。 SIGINT是从终端中断(control-C)发送的信号。 [debian.org]
谢谢罗杰,我正在寻找男性页面非常有帮助:) – Zenet 2010-02-08 19:53:53
你可以只用awk的
ps -eo pid,args | awk 'BEGIN{s="kill -9 "}$2~/bash/{s=s" "$1} END{system(s)}'
我与有关使用pkill
所有其他答复同意这样做,但是,......和而不是使用xargs
,.. 。你可以把它管道tr
:
kill $(ps aux | grep [f]irefox | awk '{print $2}' | tr '\n' ' ')
而且,考虑使用[f]
使你不匹配grep进程本身。
我认为xargs是你要找的东西:“ps aux | grep firefox | awk'{print $ 2}'| xargs kill -9”。不过在这里可以测试它。 – Tom 2010-02-08 19:32:24
您可能还想看看'killall'命令(无处不在) – cobbal 2010-02-08 19:36:56
除非有必要,否则您想避免使用'-9'。如果你只使用'kill PID',它会给程序一个清理的机会。如果没有响应,只能使用'-9'。 – 2010-02-08 19:55:56