示例会话:
- 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,而不是尾巴。
答案 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等。