如何在Bash标准输出中将多行转换为单行?

5

我有时会在我的shell中这样做:

sam@sam-laptop:~/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
4
你可能也想看一下killall命令(并非所有地方都可用)。 - cobbal
3
除非必要,否则尽量避免使用“-9”。如果仅使用“kill PID”,程序将有机会进行清理。仅在无法正常响应时使用“-9”。 - Dennis Williamson
好的,我明白了,谢谢 Dennis :) - Zenet
6个回答

11

使用xargs是简便的方法

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

这将同时使用所有PID调用kill命令。(正是您想要的)


有时候像这样的进程会在运行:'/usr/bin/python /usr/share/PackageKit/helpers/yum/yumBackend.py get-files ...firefox;5.0-2.fc15;x86_64;updates&...',使用 -9 选项会导致问题(在这个例子中,yum 可能会出现损坏的数据库/文件和未完成的更新)。 - yingted

6
    killall -9 firefox 

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

2
使用pkill代替。还有一个pgrep。
这将实现您想要的功能,而且还有什么比这更简单的呢?
pkill firefox

使用pkill的-9选项是您目前所做的;然而,避免使用SIGKILL信号:
不要轻易使用此信号。该进程将没有任何机会进行清理。它可能会留下孤儿子进程、临时文件、分配的锁、活动共享内存段、忙碌的套接字和任意数量的其他资源状态不一致。这可能导致系统在随后的操作中出现令人惊讶且难以调试的问题。 [wlug.org]
顺便提一下,这就是你不应该经常使用SIGKILL的原因。只有在进程挂起且无法以其他方式终止时才应使用SIGKILL。如果在Python脚本中使用SIGTERM或SIGINT,你会发现mplayer将在一个可用状态下离开终端。如果你经常使用SIGKILL程序,它们将没有机会清理任何东西,并且在某些情况下可能会对整个系统产生负面影响。SIGTERM是kill shell命令发送的默认信号。SIGINT是从终端中断(Control-C)发送的信号。[debian.org]

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进程本身。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接