加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 21:36:39 所属栏目:安全 来源:网络整理
导读:我有两个命令foo和bar. foo运行很长时间没有stdin或stdout / stderr活动. bar是foo的客户端,使用stdout / stderr运行,但没有stdin活动. 我想从一个shell运行它们,能够使用ctrl-c杀死它们,并在发生时查看bar的输出. 即类似这样的序列 foo 酒吧 杀了-9 但不必
我有两个命令foo和bar.

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

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

即类似这样的序列

foo&
酒吧
杀了-9

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

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

谢谢

解决方法

不要使用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

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

PS:这些解决方案意味着foo和bar可以写入您的终端(您的脚本的标准输出),但两者都无法读取标准输入.如果你需要foo或bar来从stdin读取,解决方案会变得有点复杂.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读