Bagaimana cara menemukan sesi Tmux yang dimiliki proses?

5

Contoh kasusnya adalah mengedit file konfigurasi dalam vim dan secara tidak sengaja membiarkannya terbuka. Kemudian Anda pergi tentang bisnis Anda, beralih di berbagai sesi Tmux, akhirnya mengedit file yang sama dari sesi lain dan vim akan memberi tahu Anda file .swp sudah ada.

Sekarang, bagaimana Anda menemukan sesi Tmux mana vim lainnya memegang file terbuka? Findw tampaknya hanya mencari melalui jendela sesi aktif.

lkraav
sumber

Jawaban:

10

lsof /path/to/.file.swp akan menunjukkan ID proses dari proses vim yang menyinggung. Jika Anda ingin menulis skrip, gunakan pid=$(lsof -Fp "$swp_file"); pid=${pid#p} untuk mendapatkan hanya ID proses.

Kemudian ps 12345 di mana 12345 adalah ID proses akan menunjukkan beberapa informasi tentang proses, khususnya pada apa tty itu berjalan ( ps -o tty= -p $pid dalam naskah). Tty secara unik mengidentifikasi jendela tmux (dengan asumsi proses berjalan di dalam tmux), tapi saya tidak tahu bagaimana cara beralih dari nama tty ke sesi tmux.

Apa yang akan memberi Anda sesi tmux adalah nilai TMUX variabel lingkungan dalam proses vim. Nomor sesi adalah angka terakhir, setelah koma terakhir.

Sebagian besar unix memiliki cara untuk mengetahui lingkungan suatu proses, tetapi caranya berbeda antara varian unix. Di Linux, Anda bisa menggunakan </proc/$pid/environ grep -z '^TMUX=' untuk menunjukkan nilai $TMUX dalam proses $pid, sehingga Anda dapat mengekstrak nomor sesi sebagai $(</proc/$pid/environ grep -z '^TMUX=' | sed 's/.*,//').

Gilles
sumber
ya memang, ini pada dasarnya bekerja, setidaknya untuk skenario ketika proses vi asli tidak sudoed. / proc / $ pid /viron baru bagi saya, pemikiran bagus tentang itu. mendapatkan nilai sesi sebagai angka sudah cukup baik karena sesi id huruf & gt; 9 meningkat secara alfabet.
lkraav
ketika menggunakan sudo untuk meluncurkan proses vi hipotetis untuk menemukan sesi, sepertinya perlu memiliki sudo -E untuk variabel TMUX untuk melakukan perjalanan ke lingkungan itu.
lkraav
@ lkraav: Terbaik: gunakan sudoedit dari pada sudo vim. Juga berguna untuk mengetahui kasus-kasus lain: gunakan salah satunya sudo -E atau dimasukkan Defaults !env_reset di /etc/sudoers. Dalam keadaan darurat: cari tahu proses induknya vim, yang kemungkinan merupakan shell yang berjalan di jendela tmux yang sama, dan dapatkan TMUX variabel.
Gilles
5

Cuplikan shell ini bekerja cukup baik untuk saya (Anda akan memerlukan utilitas pstree juga):

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

Untuk dua sesi tmux dengan masing-masing dua vim, saya mendapatkan output ini:

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
Tor
sumber
Terima kasih banyak! juga menambahkan -h di pstree panggilan akan menyorot panel saat ini, FWIW; atau, lewat -P $PID alih-alih harus menonjolkan beberapa $ PID yang mungkin Anda cari. Tetapi Anda tidak benar-benar membutuhkan ini, saya kira.
akavel