会有人请告诉我为什么下面bash
语句不能按Ctrl + C正确终止?
$( { ( tail -fn0 /tmp/a.txt & )| while read line; do echo $line; done } 3>&1 )
我跑这条语句,则需要两个bash
过程和一个tail
过程中推出(从获得ps auxf
),然后输入CTRL + C,它不会退出到bash
提示,就在这时,我看到两个bash
进程停止,而tail
仍在运行,然后输入我的东西到/tmp/a.txt
,那么,我们可以进入bash提示符。
我要的是,输入按Ctrl + C,然后就退出到bash
提示没有留下任何相关流程。
它会更加珍惜,有人解释这句话的确切过程,就像一个管道引起的bash叉,什么重定向到某个地方,等等。
更新时间2014年10月9日:
这里提供一些更新的情况下,它是对你有用。 我采取的解决方案是,都与2个因素:
使用TMP pid文件
( tail -Fn0 ${monitor_file} & echo "$!" >${tail_pid} ) | \ while IFS= read -r line; do xxxx done
使用陷阱等:
trap "rm ${tail_pid} 2>/dev/null; kill 0 2>/dev/null; exit;" INT TERM
trap "rm ${tail_pid} 2>/dev/null; kill 0 2>/dev/null; exit;" INT TERM
杀死相关进程和删除保持文件。
请注意,这个kill 0 2
是bash的具体,0表示当前进程组中的所有进程。 该解决方案采用TMP pid文件,而我仍然认为没有TMP PID文件等解决方案。