You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何并行运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 11:06:04