进一步阅读

进一步阅读

我很难理解我提出的有关 tmux 的问题的答案 - 具体来说,是:伪终端退出时对子进程执行的操作。

原始问题

我提交了tmux 的 GitHub 问题跟踪器上的问题:

我在 tmux 中观察到以下行为:如果我从 shell 启动脚本中启动后台进程(例如, .bashrc.profile)像这样

# ~/.bashrc

if [ -n "$TMUX" ]; then
  sleep 100 &
fi

那么当 tmux 退出时,这个进程就会被终止。也就是说,启动 tmux 后,1)我可以使用pgrep sleep;拉出 PID。 2)从tmux会话分离后我仍然可以看到它;但是 3)如果我完全退出 tmux 会话,它就不再存在。

另一方面,如果我sleep 100 &从命令提示符(从 tmux 内)手动启动,那么即使在 tmux 退出后它仍然存在。如果我在裸终端中调用sleep 100 &via .bashrc,它也会在 shell 退出后持续存在。


  • tmux v2.6
  • macOS 10.11 埃尔卡皮坦
  • bash v4.4.12(1)

官方回应

尼古拉斯·马里奥特回应:

tmux 只是关闭 pty master,这就是它的参与结束的地方,其余的取决于进程本身和内核。如果您希望后台进程(不自行管理)在其父进程退出后可靠地保留,则需要使用 nohup。

新问题

@nicm 的答案如何解释我在原始问题中描述的行为?

换句话说,为什么 pty 对待由.bashrc/生成的子进程.profile与在命令行上手动生成的子进程不同? (或者,为什么当 pty master 关闭时前者会被杀死,而后者不会?)关闭 pty master 与简单地退出终端仿真器有何不同?

答案1

M. Marriott 给出的解释是tmux 不是造成这种情况的原因

你所看到现象的解释位于别处systemd-logind,特别是会话领导者程序、控制终端、挂断信号、作业控制 shell、线路规则设置以及(在 systemd Linux 操作系统上)也引入到混合中的愚蠢的高玩意。

进一步阅读

相关内容