我很难理解我提出的有关 tmux 的问题的答案 - 具体来说,是:伪终端退出时对子进程执行的操作。
原始问题
我在 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 操作系统上)也引入到混合中的愚蠢的高玩意。