Wie finde ich heraus, zu welcher Tmux-Sitzung ein Prozess gehört?

4785
lkraav

Ein typisches Beispiel ist das Bearbeiten einer Konfigurationsdatei in vim und das unbeabsichtigte Öffnen. Dann gehen Sie Ihrem Geschäft nach, wechseln in verschiedenen Tmux-Sitzungen, bearbeiten schließlich die gleiche Datei aus einer anderen Sitzung und vim sagt Ihnen, dass eine .swp-Datei bereits vorhanden ist.

Wie finden Sie nun, in welcher Tmux-Sitzung sich der andere vim befindet, der die Datei geöffnet hat? Findw scheint nur aktive Sitzungsfenster zu durchsuchen.

5

2 Antworten auf die Frage

10
Gilles

lsof /path/to/.file.swpzeigt die Prozess-ID des betreffenden vim-Prozesses an. Wenn Sie ein Skript schreiben möchten, verwenden Sie pid=$(lsof -Fp "$swp_file"); pid=$, um nur die Prozess-ID zu erhalten.

ps 12345Wenn dann 12345 die Prozess-ID ist, werden einige Informationen zum Prozess angezeigt, insbesondere zur Angabe, auf welcher tty es ausgeführt wird ( ps -o tty= -p $pidin einem Skript). Das tty identifiziert eindeutig ein tmux-Fenster (vorausgesetzt, der Prozess läuft innerhalb von tmux), aber ich weiß nicht, wie ich vom tty-Namen zur tmux-Sitzung wechseln soll.

Was Sie für die tmux-Sitzung erhalten würden, ist der Wert der TMUXUmgebungsvariablen im vim-Prozess. Die Sitzungsnummer ist die letzte Nummer nach dem letzten Komma.

Die meisten Unices haben eine Möglichkeit, die Umgebung eines Prozesses herauszufinden, die Art und Weise unterscheidet sich jedoch zwischen den Unix-Varianten. Unter Linux können Sie </proc/$pid/environ grep -z '^TMUX='den Wert von $TMUXin process $pidanzeigen, um die Sitzungsnummer als zu extrahieren $(</proc/$pid/environ grep -z '^TMUX=' | sed 's/.*,//').

Ja, dies funktioniert grundsätzlich, zumindest für Szenarien, in denen der ursprüngliche vi-Prozess nicht unterstützt wird. / proc / $ pid / environ war neu für mich, ich denke gut darüber nach. Den Sitzungswert als Zahl zu erhalten ist gut genug, da die Buchstaben der Sitzungs-ID> 9 einfach alphabetisch zunehmen. lkraav vor 13 Jahren 0
Wenn Sie sudo verwenden, um den hypothetischen vi-Prozess zum Durchsuchen der Sitzung zu starten, scheint es, dass er über sudo -E verfügen muss, damit die TMUX-Variable in ihre Umgebung gelangen kann. lkraav vor 13 Jahren 0
@lkraav: Am besten: Verwenden Sie "sudoedit" anstelle von "sudo vim". Für andere Fälle auch hilfreich: entweder `sudo -E` oder` Defaults! Env_reset` in `/ etc / sudoers`. Zur Not: Finden Sie den übergeordneten Prozess von `vim` heraus, bei dem es sich wahrscheinlich um eine Shell handelt, die im selben tmux-Fenster ausgeführt wird, und rufen Sie die` TMUX'-Variable auf. Gilles vor 13 Jahren 0
5
Tor

Dieses Shell-Snippet funktioniert ziemlich gut für mich (Sie benötigen auch das Dienstprogramm pstree):

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 

Für zwei tmux-Sitzungen mit jeweils zwei vims bekomme ich folgende Ausgabe:

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 
vielen Dank! Durch Hinzufügen von "-h" in "pstree" wird der aktuelle Bereich hervorgehoben, FWIW; Wenn Sie stattdessen "-P $ PID" übergeben, sollten Sie die von Ihnen gesuchten $ PID markieren. Aber du brauchst das nicht wirklich, nehme ich an. akavel vor 10 Jahren 0