如何并行运行prog1与prog2并保持prog1的stdin连接至shell
问题原因
非交互式shell的默认规则导致了这个问题:
- 所有带
&后缀的后台进程,默认会被自动将标准输入重定向到/dev/null,同时作业控制机制会阻止后台进程读取终端输入,因此后台启动的prog1从启动开始就失去了和shell标准输入的连接。 - 非交互式shell默认关闭作业控制,
fg命令无法正常将后台进程拉回前台并恢复IO绑定,哪怕执行fg也无法修复stdin断开的问题。
解决方法
修改脚本如下即可:
#!/bin/bash # 手动开启作业控制,让非交互式shell支持fg/bg逻辑 set -m # 显式绑定prog1的stdin/stdout/stderr到当前shell的对应文件描述符,再放入后台 ./prog1 <&0 >&1 2>&2 & PROG1_PID=$! # 启动prog2,保持原有逻辑:关闭stdin、标准输出重定向到标准错误 ./prog2 "$PROG1_PID" 1>&2 0<&- & # 明确将prog1拉回前台,接管终端输入输出 fg "$PROG1_PID"
关键修改说明
- 开头新增
set -m开启作业控制,保证fg命令可以正常工作,将后台进程拉回前台后自动接管终端IO。 - 启动
prog1时显式添加<&0 >&1 2>&2,强制绑定它的标准输入、输出、错误流到当前脚本的对应文件描述符,避免非交互式shell默认把后台进程的IO重定向到/dev/null。 - 单独保存
prog1的PID变量,避免嵌套子shell导致的PID获取异常,fg时指定PID也避免拉错后台作业。 prog2也放入后台运行,保证两个程序完全并行执行。
内容的提问来源于stack exchange,提问作者Freddie Mercury
相关产品推荐
相关产品推荐

