kill 在 while 循环中不起作用
kill not working in while loop
我想在 while 循环中终止 lsof 给出的所有进程。
这很好用:
lsof -i tcp | grep -v iceweasel | awk '{ print }' | while read -r line
do
echo "$line"
done;
这个没有:
lsof -i tcp | grep -v iceweasel | awk '{ print }' | while read -r line
do
kill "$line"
done;
最后一次产生的错误是:
./kill.all.sh: line 6: kill: PID: arguments must be process or job IDs
有什么想法吗?谢谢。
不要重新发明轮子。杀死所有使用 tcp 的进程,除了 iceweasel:
kill $(lsof -c ^iceweasel -a -i tcp -t)
问题在于 lsof -i tcp
的输出包含 header,其 PID
项最终传递给 kill
命令(kill PID
) 从而导致错误。
为无头输出使用 -t
选项,或者使用 AWK 忽略第一行:
awk 'NR > 1 { print }'
其中 NR
是记录(行)号。
注意kill
只向进程发送SIGTERM
信号,进程可能只是忽略它。如果你想确定终止进程,运行 kill
和 -9
(-KILL
) 选项(请参阅 man 7 signal
了解信号代码)。
我想在 while 循环中终止 lsof 给出的所有进程。
这很好用:
lsof -i tcp | grep -v iceweasel | awk '{ print }' | while read -r line
do
echo "$line"
done;
这个没有:
lsof -i tcp | grep -v iceweasel | awk '{ print }' | while read -r line
do
kill "$line"
done;
最后一次产生的错误是:
./kill.all.sh: line 6: kill: PID: arguments must be process or job IDs
有什么想法吗?谢谢。
不要重新发明轮子。杀死所有使用 tcp 的进程,除了 iceweasel:
kill $(lsof -c ^iceweasel -a -i tcp -t)
问题在于 lsof -i tcp
的输出包含 header,其 PID
项最终传递给 kill
命令(kill PID
) 从而导致错误。
为无头输出使用 -t
选项,或者使用 AWK 忽略第一行:
awk 'NR > 1 { print }'
其中 NR
是记录(行)号。
注意kill
只向进程发送SIGTERM
信号,进程可能只是忽略它。如果你想确定终止进程,运行 kill
和 -9
(-KILL
) 选项(请参阅 man 7 signal
了解信号代码)。