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

use*_*642 4 bash shell scripting process

我有两个命令foo和bar.

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

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

即类似这样的序列

foo&bar kill -9

但不必手动执行kill - 相反它只是在ctrl-c上发生

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

谢谢

lhu*_*ath 5

不要用kill -9.

你想陷阱EXIT,而不是INT.

trap 'kill $fooPid $barPid' EXIT
foo & fooPid=$!
bar & barPid=$!
wait
Run Code Online (Sandbox Code Playgroud)

该解决方案将始终确保终止,foo并且bar无论其退出的原因(不包括它被SIGKILL编辑).

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

trap 'kill $(jobs -p)' EXIT
foo &
bar &
wait
Run Code Online (Sandbox Code Playgroud)

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

PS:这些解决方案意味着foobar可以写入到终端(你的脚本stdout),但也可以读取stdin.如果你需要或者foo还是bar从标准输入读取,溶液变成一个有点复杂.