如何查找进程属于哪个 Tmux 会话?

lkr*_*aav 6 unix process tmux

一个典型的例子是在 vim 中编辑配置文件并无意中将其打开。然后你开始你的工作,在不同的 Tmux 会话中切换,最终从另一个会话编辑同一个文件,vim 会告诉你一个 .swp 文件已经存在。

现在,您如何找到另一个打开文件的 vim 所在的 Tmux 会话?Findw 似乎只搜索活动会话窗口。

Gil*_*il' 12

lsof /path/to/.file.swp将显示有问题的 vim 进程的进程 ID。如果您想编写脚本,请使用pid=$(lsof -Fp "$swp_file"); pid=${pid#p}来获取进程 ID。

然后ps 1234512345 是进程 ID 的位置将显示有关进程的一些信息,特别是它正在运行的 tty(ps -o tty= -p $pid在脚本中)。tty 唯一标识了一个 tmux 窗口(假设进程在 tmux 内部运行),但我不知道如何从 tty 名称转到 tmux 会话。

什么会给你 tmux 会话是TMUXvim 进程中环境变量的值。会话编号是最后一个逗号之后的最后一个数字。

大多数 unices 有办法找出进程的环境,但 unix 变体之间的方式不同。在 Linux 上,您可以使用</proc/$pid/environ grep -z '^TMUX='来显示$TMUXin process的值$pid,因此您可以将会话编号提取为$(</proc/$pid/environ grep -z '^TMUX=' | sed 's/.*,//')


小智 6

这个 shell 片段对我来说效果很好(你还需要 pstree 实用程序):

for s in `tmux list-sessions -F '#{session_name}'` ; do
  echo -e "\ntmux session name: $s\n--------------------"
  for p in `tmux list-panes -s -F '#{pane_pid}' -t "$s"` ; do
    pstree -p -a -A $p
  done
done
Run Code Online (Sandbox Code Playgroud)

对于每个有两个 vim 的两个 tmux 会话,我得到以下输出:

tmux session name: 0
--------------------
zsh,3444
  `-vim,3467 file_1
zsh,3474
  `-vim,3495 file_2

tmux session name: 1
--------------------
zsh,3526
  `-vim,3547 file_3
zsh,3554
  `-vim,3576 file_4
Run Code Online (Sandbox Code Playgroud)