如何杀死管道后台进程?

时间:2013-11-11 13:04:35

标签: linux bash pipe

示例会话:

- cat myscript.sh 
#!/bin/bash
tail -f example.log | grep "foobar" &
echo "code goes here"
# here is were I want tail and grep to die
echo "more code here"

- ./myscript.sh

- ps
  PID TTY          TIME CMD
15707 pts/8    00:00:00 bash
20700 pts/8    00:00:00 tail
20701 pts/8    00:00:00 grep
21307 pts/8    00:00:00 ps

如您所见,tail和grep仍在运行。


以下内容会很棒

#!/bin/bash
tail -f example.log | grep "foobar" &
PID=$!
echo "code goes here"
kill $PID
echo "more code here"

但这只能杀死grep,而不是尾巴。

2 个答案:

答案 0 :(得分:2)

虽然整个管道在后台执行,但只有grep进程的PID存储在$!中。你想告诉kill取消整个工作。您可以使用%1,这将终止当前shell启动的第一个作业。

#!/bin/bash
tail -f example.log | grep "foobar" &
echo "code goes here"
kill %1
echo "more code here"

即使您刚刚终止grep进程,tail进程也应该在下次尝试写入标准输出时退出,因为grep退出时该文件句柄已关闭。取决于example.log更新的频率,这可能几乎是立即的,或者可能需要一段时间。

答案 1 :(得分:2)

您可以在脚本末尾添加kill %1

这会杀死所创建的first背景,这样就无需查找pids等。