-->

不能终止与shell命令按Ctrl + C(Cannot terminate a shell com

2019-09-28 00:03发布

会有人请告诉我为什么下面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个因素:

  1. 使用TMP pid文件

     ( tail -Fn0 ${monitor_file} & echo "$!" >${tail_pid} ) | \ while IFS= read -r line; do xxxx done 
  2. 使用陷阱等: 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文件等解决方案。

Answer 1:

它的工作原理套住INT信号(由发送Ctrl-C )杀tail过程。

$( r=$RANDOM; trap '{ kill $(cat /tmp/pid$r.pid);rm /tmp/pid$r.pid;exit; }' SIGINT EXIT; { ( tail -fn0 /tmp/a.txt & echo $! > /tmp/pid$r.pid  )| while read line; do echo $line; done } 3>&1 )

(我用一个随机值在PID文件名,至少大部分允许多个实例运行)



文章来源: Cannot terminate a shell command with Ctrl+c