如何运行两个进程,好像它们是bash中的一个?

时间:2009-04-02 13:48:34

标签: bash shell process scripting

我有两个命令foo和bar。

foo在没有stdin或stdout / stderr活动的情况下运行很长时间。 bar是foo的客户端,使用stdout / stderr运行,但没有stdin活动。

我想从一个shell运行它们,能够使用ctrl-c杀死它们,并在发生时查看bar的输出。

即。像这个序列

foo& 酒吧 杀了-9

但无需手动执行kill - 相反,它只发生在ctrl-c

有没有一种编写脚本的方法?

感谢

2 个答案:

答案 0 :(得分:5)

请勿使用kill -9

您希望陷入EXIT,而不是INT

trap 'kill $fooPid $barPid' EXIT
foo & fooPid=$!
bar & barPid=$!
wait

此解决方案将始终确保终止foobar,无论退出的原因是什么(不包括SIGKILL')。

如果你想避免保留PID(有一些竞争条件问题),你可以这样做:

trap 'kill $(jobs -p)' EXIT
foo &
bar &
wait

如果您的脚本没有其他工作,这是一个更好(更清洁!)的解决方案。

<强>诗: 这些解决方案意味着foobar可以写入您的终端(您的脚本的stdout),但两者都无法从stdin读取。如果您需要从{stid}读取foobar,则解决方案将变为更复杂。

答案 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它就会发现它会终止两个睡眠过程。