执行 bg %1 后作业运行,但 shell 保留终端前台;执行 fg %1 后运行中的作业取得前台。终端同一时刻只有一个前台进程组。

作业控制在进程组之间交接终端前台

交互式作业控制让 shell 管理共享控制终端的多个进程组。终端同一时刻只有一个前台组,其他作业可以在后台运行,也可以保持停止状态。前台归属、是否运行和 shell 的作业表,是三种不同状态。后台作业不等于已经暂停,停止作业也不等于已经终止;判断当前交互为什么没有进展,需要先分清这些状态。 是否运行与终端前台归属是不同状态。bg 恢复作业但不交出键盘,fg 恢复前台交互。shell 作业表不等于持久服务状态。 坏掉的样子 启用终端信号处理时,输入已配置的中断或暂停字符,会由终端驱动向前台组发送信号,不是只发送给最后打印文字的那个进程。控制字符重新映射、终端模式变化以及应用信号处理函数,都可能改变结果。因此只说按某个键,并不能保证在每个程序和每套终端配置中得到相同反应,还要核对实际处理条件。 普通后台作业尝试读取自己的控制终端时,会被 SIGTTIN 停止。把它放到后台,并不会给它单独分配一份键盘输入流。输出又有不同规则:后台写入通常允许,还会受 TOSTOP 等终端设置影响。因此后台执行不意味着彻底脱离终端,输入、输出和前台信号各有自己的约束,需要分别观察。 %1 这类作业标识属于某个 shell 的作业表,不是全局进程编号。换一个终端或进入非交互 shell 后,不能假定相同号码仍然管理相同任务。管道和后台命令如何分组,也取决于真实 shell 调用是否启用了作业控制。交互终端中看见的行为,不能不加检查地套到所有脚本启动路径上。 快速验证 把脚本保存为 jobcontrol.py,在装有 Bash 和 Python 的 Linux 环境中运行 python3 jobcontrol.py。保留的 2026-10-15 审查曾使用 Linux 6.18.44、Bash 5.2.37 和 Python 3.12.14 原样重跑两种语言样本。这些是历史观察,本次源码审查没有重新运行交互实验。脚本创建自己的伪终端与交互 Bash,不会把控制字符发给你用于启动它的终端: ...

九月 27, 2027 · 2 分钟 · XB Field Notes