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

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

例如,在 vim 中编辑配置文件时不小心将其打开。然后你继续工作,在不同的 Tmux 会话中切换,最终在另一个会话中编辑同一个文件,vim 会告诉你 .swp 文件已经存在。

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

答案1

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

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

tmux 会话的产生是TMUXvim 进程中环境变量的值。会话编号是最后一个逗号后面的最后一个数字。

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

答案2

这个 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

对于两个分别具有两个 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

答案3

使用来自 Tor 的响应进行迭代,一小段 bash 代码来获取特定 PID 正在运行的会话、窗口和窗格:

export PID=1161102; for s in `tmux list-sessions -F '#{session_name}'` ; do
  for p in `tmux list-panes -s -F '#{pane_pid}' -t "$s"` ; do
    pstree -h -p -a -A $p | grep "[,]$PID" && tmux list-panes -s -t "$s" -f "#{==:#{pane_pid},$p}" -F '#{session_name}: #{window_index}.#{pane_index}'
  done
done

示例输出:

  `-skydive,1161102 analyzer -c skydive.yml
SESSIONNAME: 2.3

相关内容