2

在启用作业控制并关闭标准输入的情况下在后台运行 bash 脚本将退出PARENT shell。怎么会这样?

为了演示这个background_bash_script

#!/bin/bash
set -m
ruby -e "puts :here"

然后在 bash 中运行它——它会退出你运行它的 shell。ruby 命令无关紧要,尽管它看起来必须是一个命令而不是内置的 bash(例如awk --version可以工作但true不能)。为了看得更清楚,我一直在另一个 bash 实例中运行它。一个完整的会话看起来像这样。

parent: PS1='child: ' bash
child: ./background_bash_script <&- &
[1] 3893
child: here
exit
parent:

令人困惑!

4

1 回答 1

0

似乎正在发生的是,在set -m脚本中运行之后,运行的下一个命令被强制在前台进程组中,这将原始 shell 带出前台进程组。一旦该进程退出,运行脚本的 shell 现在就在前台进程组中,但是一旦该 shell 退出,原始 shell 不会将自己放回前台进程组,因为它在后台运行脚本。因此,您现在拥有一个位于后台进程组中的交互式 shell。

如果您在脚本的末尾放置一个 sleep 以便它不会立即退出,您会在这里看到一些奇怪的行为。当您在后台运行脚本时,您会返回终端提示符,但现在您的交互式 shell 不在前台进程组中!一旦您尝试键入任何内容,shell 就会退出。我不确定究竟是什么机制导致退出。由于 shell 在后台,任何对终端读取或写入字符的尝试都应导致 SIGTTIN 或 SIGTTOU,但这些信号不会导致 shell 在我的测试中退出。

于 2013-09-04T06:14:21.873 回答