Как узнать, к какому сеансу Tmux принадлежит процесс?

4602
lkraav

Примером является редактирование файла конфигурации в vim и непреднамеренное оставление его открытым. Затем вы занимаетесь своими делами, переключаетесь в разные сеансы Tmux, в конечном итоге редактируете тот же файл из другого сеанса, и vim сообщит вам, что файл .swp уже существует.

Теперь, как вы узнаете, в каком сеансе Tmux находится другой vim, содержащий открытый файл? Похоже, что Findw осуществляет поиск только через активные окна сеанса.

5

2 ответа на вопрос

10
Gilles

lsof /path/to/.file.swpпокажет идентификатор процесса нарушающего процесса vim. Если вы хотите написать скрипт, используйте, pid=$(lsof -Fp "$swp_file"); pid=$чтобы получить только идентификатор процесса.

Тогда, ps 12345где 12345 - это идентификатор процесса, будет отображаться некоторая информация о процессе, в частности, о том, что он запущен ( ps -o tty= -p $pidв скрипте). Tty однозначно идентифицирует окно tmux (при условии, что процесс выполняется внутри tmux), но я не знаю, как перейти от имени tty к сеансу tmux.

Что бы дать вам сеанс tmux - это значение TMUXпеременной окружения в процессе vim. Номер сеанса - это последний номер после последней запятой.

У большинства объединений есть способ узнать среду процесса, но этот способ отличается в разных вариантах Unix. В Linux вы можете использовать </proc/$pid/environ grep -z '^TMUX='для отображения значения $TMUXв процессе $pid, поэтому вы можете извлечь номер сеанса как $(</proc/$pid/environ grep -z '^TMUX=' | sed 's/.*,//').

да, действительно, это в основном работает, по крайней мере, для сценария, когда оригинальный процесс vi не заблокирован. / proc / $ pid / environment был для меня новым, хорошо об этом подумал. получение значения сеанса в виде числа достаточно хорошо, поскольку буквы идентификатора сеанса> 9 просто увеличиваются в алфавитном порядке. lkraav 13 лет назад 0
при использовании sudo для запуска гипотетического процесса vi для поиска сеанса создается впечатление, что для перемещения переменной TMUX в его среду требуется sudo -E. lkraav 13 лет назад 0
@lkraav: лучше всего: использовать `sudoedit` вместо` sudo vim`. Также полезно знать это для других случаев: либо используйте `sudo -E`, либо поместите` Defaults! Env_reset` в `/ etc / sudoers`. В крайнем случае: найдите родительский процесс `vim`, который, вероятно, будет оболочкой, запущенной в том же окне tmux, и получите его переменную` TMUX`. Gilles 13 лет назад 0
5
Tor

This shell snippet works pretty well for me (you'll need the pstree utility as well):

for s in `tmux list-sessions -F '#'` ; do echo -e "\ntmux session name: $s\n--------------------" for p in `tmux list-panes -s -F '#' -t "$s"` ; do pstree -p -a -A $p done done 

For two tmux sessions with two vim's each, I get this output:

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 
большое спасибо! также добавление `-h` в вызове` pstree` выделит текущую панель, FWIW; или, передавая `-P $ PID`, вы должны выделить $ PID, который вы можете искать. Но я думаю, тебе это не нужно. akavel 11 лет назад 0