例如,在 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 会话的产生是TMUX
vim 进程中环境变量的值。会话编号是最后一个逗号后面的最后一个数字。
大多数 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