bash - Kill 在 while 循环中不起作用

标签 bash awk kill lsof

我想在 while 循环中终止 lsof 给出的所有进程。

这工作正常:

lsof -i tcp | grep -v iceweasel | awk '{ print $2 }' | while read -r line
do
    echo "$line"

done;

这个没有:

lsof -i tcp | grep -v iceweasel | awk '{ print $2 }' | while read -r line
    do
        kill "$line"

    done;

最后一段产生的错误是:

./kill.all.sh: line 6: kill: PID: arguments must be process or job IDs

有什么想法吗?谢谢。

最佳答案

问题在于lsof -i tcp的输出包含 header ,其PID项最终传递给kill命令(kill PID)从而导致错误。

使用 -t 选项进行 headless 输出,或者使用 AWK 忽略第一行:

awk 'NR > 1 { print $2 }'

其中 NR 是记录(行)号。

请注意,kill 仅向进程发送 SIGTERM 信号,进程可能只是忽略它。如果您想确定终止进程,请使用 -9 (-KILL) 选项运行 kill (请参阅 man 7 signal 信号代码)。

关于bash - Kill 在 while 循环中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41442203/

相关文章:

sed 中的 awk 语句

c++ - 如何在C++中杀死系统进程

linux - “For”循环并在 Bash 脚本中休眠

linux - 在 Unix/Linux 上获取昨天的文件

linux - 如何使用 bash 从文件中删除文本 block

linux - 如何在 Linux 中使用 sed 将 ".net"替换为空格?

linux - 从 awk 脚本内的变量字符串中删除最后一行

ubuntu - 如何杀死在 Windows、Linux 和 MacOS 中特定端口上运行的进程 - C# (.Net Core)

arrays - Bash - 仅在出现新行而不是空格时进入下一个索引?

bash - 从 .bashrc 启动后台进程