2010-02-08 84 views
5

我有时会做这在我的外壳:如何在bash stdout中将多行转换为一行?

[email protected]:~/shell$ ps aux | grep firefox | awk '{print $2}' 
2681 
2685 
2689 
4645 

$ kill -9 2681 2685 2689 4645 

有没有一种方法,我可以转换包含的PID的多条线路到用空格隔开一条线? (每次输入PID都有点麻烦,我真的很想知道:))

非常感谢。

+4

我认为xargs是你要找的东西:“ps aux | grep firefox | awk'{print $ 2}'| xargs kill -9”。不过在这里可以测试它。 – Tom 2010-02-08 19:32:24

+4

您可能还想看看'killall'命令(无处不在) – cobbal 2010-02-08 19:36:56

+3

除非有必要,否则您想避免使用'-9'。如果你只使用'kill PID',它会给程序一个清理的机会。如果没有响应,只能使用'-9'。 – 2010-02-08 19:55:56

回答

11

这个最简单的方式是使用xargs的

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

这将调用与在同一时间所有PID kill命令。 (正是你想要的)

+0

伟大的,我知道然后:) – Tom 2010-02-08 19:33:12

+0

像这样的进程有时会碰巧运行:'/ usr/bin/python/usr/share/PackageKit/helpers/yum/yumBackend.py get-files ... firefox; 5.0-2.fc15; x86_64; updates&...'和-9会导致问题(在这个例子中,yum可能会损坏数据库/文件和一个中断的更新) – yingted 2011-08-09 19:09:36

2
pids="" 
for pid in $(ps aux | grep firefox | awk '{print $2}') 
do 
pids=" $pid" 
done 
kill -9 $pids 
+3

你的意思是'pids =“$ pids $ pid”'?我不明白这是如何工作的... – 2010-02-08 19:35:29

+1

感谢作品像一个魅力:) – Zenet 2010-02-08 19:57:04

2

改为使用pkill。还有一个pgrep。

这会做你想做的事情,你能得到多少简单?

pkill firefox 

使用-9选项打击将是你目前的工作;但是,请避免使用SIGKILL:

请勿轻微使用此信号。这个过程不会有任何清理的机会。它可能会遗留孤儿子进程,临时文件,分配的锁,活动的共享内存段,繁忙的套接字以及任何数量的其他资源状态不一致。这会导致在系统的后续操作中出现令人惊讶和难以调试的问题。 [wlug.org]

和:

顺便说一句,这是一个原因,你不应该经常使用 SIGKILL。只有当进程被挂起并且不能以任何其他方式死亡时,才能使用SIGKILL。如果在python脚本中使用 SIGTERM或SIGINT,您将看到mplayer将使终端处于USABLE状态。如果您经常使用SIGKILL程序 ,则无法在某些情况下清理任何内容,并可能对整个系统产生不利影响。

SIGTERM是kill shell命令发送的默认信号。 SIGINT是从终端中断(control-C)发送的信号。 [debian.org]

+1

谢谢罗杰,我正在寻找男性页面非常有帮助:) – Zenet 2010-02-08 19:53:53

6
killall -9 firefox 
+0

作品太:)谢谢! – Zenet 2010-02-10 19:20:04

2

你可以只用awk的

ps -eo pid,args | awk 'BEGIN{s="kill -9 "}$2~/bash/{s=s" "$1} END{system(s)}' 
2

我与有关使用pkill所有其他答复同意这样做,但是,......和而不是使用xargs,.. 。你可以把它管道tr

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

而且,考虑使用[f]使你不匹配grep进程本身。