我在一台共享 Linux 服务器上操作。团队成员通常会打开几个 tmux 会话并运行一些长时间运行的命令,然后断开他们的 ssh 会话。最终他们启动的进程会完成,但他们可能要再过一两周才会重新连接。
我们有时想重置所述 Linux 服务器,但我们想检查当前打开的任何 tmux 会话中是否还有正在运行的进程/程序/命令。除了附加到每个 tmux 会话并循环浏览每个窗口外,我如何检查哪些 tmux 会话仍有正在运行的进程/命令,更好的是,查看仍在运行的命令是什么?
如果有一种方法可以做到这一点,即与多路复用器无关(例如,它可以与 tmux 和屏幕一起使用),那就更好了。
答案1
如果你不介意需要人工来解析结果,
ps -auxf | grep "tmux\|screen" -A 5
效果很好。传递-xf
到会ps
以树状方式列出其父进程下的子进程,并在启用几行上下文的情况下 grep tmux/screen/etc(在此示例中使用-A(fter) 5
)会显示您需要了解的几乎所有内容。
答案2
要 grep tmux PID,您可以使用;
ps aux | grep tmux | grep -v grep | awk '{print $2}'
要获取活动子进程树,请换出< 进程 ID >在以下命令中;
ps --forest $(ps -e --no-header -o pid,ppid|awk -vp=<PID>'function r(s){print s;s=a[s];while(s){sub(",","",s);t=s;sub(",.*","",t);sub("[0-9]+","",s);r(t)}}{a[$2]=a[$2]","$1}END{r(p)}')
对于不太详细的列表,您可以使用 pstree
pstree -h <PID>