我while
在 tmux 状态栏中嵌入了一个无限循环 bash 脚本。在 ~/.tmux/conf 中:
set -g status-right '... #(path/loop.sh) ...'
Tmux 似乎使用sh -c
. tmux 启动后:
$ ps x | grep loop.sh
23433 pts/4 S+ 0:00 grep --color=auto loop.sh
31814 ? S 0:00 sh -c path/loop.sh
31818 ? S 0:00 /bin/bash path/loop.sh
tmux kill-session
终止sh -c
进程。如果我strace
它并终止会话:
$ strace -p 31814
strace: Process 31814 attached
wait4(-1, 0x7ffeacbfbf9c, 0, NULL) = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
--- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=27643, si_uid=1000} ---
+++ killed by SIGTERM +++
但是由于无限循环,子shell保持不变:
$ ps x | grep loop.sh
2443 pts/4 S+ 0:00 grep --color=auto loop.sh
31818 ? S 0:00 /bin/bash path/loop.sh
问题
我希望子外壳在 tmux 会话结束后自动终止。有没有办法通过更改 tmux 设置或处理SIGTERM
发送到sh -c
进程来做到这一点?
(编辑:tmux 版本是 2.8)
是的,开始的子进程
tmux -c "start process here"
似乎在相应的tmux
会话中存活下来。我已经仔细研究了tmux
'广泛的手册页,有一段时间我希望在全球范围内设置tmux
命令的后挂钩可以提供帮助。后挂钩具有以下形式:其中“your_cmd_here”可以用来杀死生成无限循环的子进程。但这无济于事,因为“your_cmd_here”实际上必须是
tmux
cmd 而不是 linux shell cmd。相反,一个快速的技巧是在
/path/loop.sh
脚本的无限循环中添加一行,例如:只要
tmux
在ps -ae
. 相反,如果tmux
显示相关进程,则循环继续不受影响。实际上,对于上述测试的更好版本,对于您将退出
tmux
会话但仍然有例如man tmux
系统上处于活动状态的进程的极端情况,是:tmux
出现在输出中\ps -e
但不是作为主进程的情况,即不在输出行的第 4 位ps -e
,而是作为正在运行的进程的参数,或者随便作为嵌入在的输出\ps -e
。ps
通过在 cmd as 之前添加反斜杠来使用纯粹的形式\ps
。这是为了防止 cmd 的修改版本与awk
. 例如,如果您使用\ps -eF
而不是\ps -e
例如,您将需要更改$4
为$11
.HTH。