我有两个命令foo和bar。
foo在没有stdin或stdout / stderr活动的情况下运行很长时间。 bar是foo的客户端,使用stdout / stderr运行,但没有stdin活动。
我想从一个shell运行它们,能够使用ctrl-c杀死它们,并在发生时查看bar的输出。
即。像这个序列
foo& 酒吧 杀了-9
但无需手动执行kill - 相反,它只发生在ctrl-c
上有没有一种编写脚本的方法?
感谢
答案 0 :(得分:5)
请勿使用kill -9
。
您希望陷入EXIT
,而不是INT
。
trap 'kill $fooPid $barPid' EXIT
foo & fooPid=$!
bar & barPid=$!
wait
此解决方案将始终确保终止foo
和bar
,无论退出的原因是什么(不包括SIGKILL
')。
如果你想避免保留PID(有一些竞争条件问题),你可以这样做:
trap 'kill $(jobs -p)' EXIT
foo &
bar &
wait
如果您的脚本没有其他工作,这是一个更好(更清洁!)的解决方案。
<强>诗强>:
这些解决方案意味着foo
和bar
可以写入您的终端(您的脚本的stdout
),但两者都无法从stdin
读取。如果您需要从{stid}读取foo
或bar
,则解决方案将变为位更复杂。
答案 1 :(得分:2)
您可以设置bash脚本来运行程序,并使用trap
来捕获CTRL-C。然后,在trap调用的函数中,只需删除程序。
我这样做了一段时间,但我认为以下说明了这一点。
#!/bin/bash
xx() {
kill -9 $pid1
kill -9 $pid2
echo bye
}
trap 'xx' SIGINT
sleep 1000 &
pid1=$!
sleep 2000 &
pid2=$!
sleep 3600
只需运行此脚本并按CTRL-C它就会发现它会终止两个睡眠过程。