在后台运行bash脚本并启用作业控制并关闭stdin将退出 PARENT shell。怎么会发生这种情况?
演示制作此background_bash_script
:
#!/bin/bash
set -m
ruby -e "puts :here"
然后在bash中运行它 - 它将退出你运行它的shell。虽然看起来它必须是一个命令而不是内置的bash(例如awk --version
可以工作但是ruby命令无关紧要) true
没有)。为了更好看,我一直在另一个bash实例中运行它。完整的会话看起来像这样。
parent: PS1='child: ' bash
child: ./background_bash_script <&- &
[1] 3893
child: here
exit
parent:
混乱!
答案 0 :(得分:0)
似乎正在发生的事情是,在脚本中运行set -m
之后,下一个运行的命令被强制放在前台进程组中,该进程组将原始shell从前台进程组中取出。一旦该进程退出,运行该脚本的shell现在位于前台进程组中,但是一旦该shell退出,原始shell就不会将自己放回到前台进程组,因为它在后台运行该脚本。因此,您现在拥有一个后台进程组中的交互式shell。
如果你在脚本的末尾放一个睡眠,它就不会立即退出,你可以在这里看到一些奇怪的行为。当您在后台运行脚本时,您会收到终端提示,但现在您的交互式shell不在前台进程组中!只要你尝试键入任何东西,shell就会退出。我不确定究竟是什么机制导致退出。由于shell在后台,所以任何向终端读取或写入字符的尝试都应该导致SIGTTIN或SIGTTOU,但这些信号不会导致shell在我的测试中退出。