it-swarm.com.de

Warum erhalte ich von tmux die Meldung "Verbindung zum Server fehlgeschlagen", wenn ich versuche, Sitzungen aufzulisten?

Folgendes passiert mit mir: Ich starte tmux-Sessions mit tmux -L name1, tmux -L name2; dann löse ich sie mit ctrl+B+d. Anschließend versuche ich, eine Liste der aktuell auf meinem Computer ausgeführten Sitzungen abzurufen. Wenn ich jedoch tmux ls Bekomme ich eine Fehlermeldung:

failed to connect to server: Connection refused

Ist das ein Bug? Ich kenne mich mit dem Bildschirm aus. Ich betrachte screen -ls als eine sehr nützliche Funktion, da ich möglicherweise eine Sitzung starten und wochenlang laufen lassen kann, bevor ich sie das nächste Mal anhänge. Aus diesem Grund ist es für mich sehr wichtig, aktuelle tmux-Sessions aufzulisten. Warum tut tmux ls einen Fehler "Verbindung abgelehnt" zurückgeben, wenn ich weiß, dass tmux ausgeführt wird?

57
thinke365

TL; DR: Versuchen Sie, ein SIGUSR1 - Signal an den tmux-Server zu senden.

In meinem Fall konnte ich nach ca. 8 Tagen Inaktivität Folgendes nicht wieder anbringen:

$ tmux attach
no sessions

Ein grep für tmux-Prozess brachte mir jedoch folgende Ausgabe:

$ ps -aef | fgrep -i tmux
hari     7139     1  1  2016 ?        2-20:32:31 tmux
hari    25943 25113  0 22:00 pts/0    00:00:00 fgrep --color=auto -i tmux

Wie von @ 7heo.tk vorgeschlagen, weist dies darauf hin, dass der tmux-Server noch ausgeführt wird, aber tmux ls Einen failed to connect to server: Connection refused - Fehler ausgegeben hat. Ich habe überprüft, ob das zur tmux-Sitzung gehörende tmp-Verzeichnis existiert, und lsof -p 7139 (Die PID des tmux-Servers) hat gezeigt, dass die Socket-Datei geöffnet ist:

COMMAND  PID  USER   FD   TYPE             DEVICE SIZE/OFF       NODE NAME
tmux    7139 hari    5u  unix 0x0000000000000000      0t0 1712879255 /tmp/tmux-50440/default

Ich habe auch versucht, tmux explizit -S /tmp/tmux-50440/default Zuzuweisen, aber es hat nicht geholfen. Allerdings habe ich in der tmux-Manpage gelesen, dass das Senden von SIGUSR1 Dazu führen würde, dass tmux die Socket-Datei neu erstellt. Deshalb habe ich das versucht und konnte die Sitzung sofort finden und erneut anfügen:

$ kill -s USR1 7139
$ tmux ls
0: 12 windows (created Mon Apr 18 21:17:55 2016) [198x62]
56
haridsv

Dies passiert mir, wenn keine Sitzungen ausgeführt werden. Ich habe gerade angefangen, tmux zu verwenden und habe nicht bemerkt, dass Sie Ihre Sitzungen verlieren, wenn Sie Ihren Computer neu starten, was mich zuerst überrascht hat.

Für diejenigen unter Ihnen, die das Gleiche denken: tmux-Sitzung nach dem Neustart wiederherstellen . Eine Zusammenfassung des Beitrags: Verwenden Sie Shell-Skripte, um Ihre tmux-Sitzungen zu erstellen, oder erstellen Sie ein ausgefallenes Shell history tracker .

32
Nathan

Sie erhalten diesen Fehler tatsächlich, wenn keine Sitzung geöffnet ist. Wenn keine Sitzungen geöffnet sind, wird kein tmux-Server ausgeführt, sodass keine Verbindung hergestellt werden kann.

Mit dem -L Wenn Sie den vom tmux-Server verwendeten Socket-Namen ändern, können Sie Ihre Sitzungen nicht benennen. Verwenden Sie besser die folgenden Befehle:

tmux new -s name1
tmux new -s name2

Dadurch werden 2 Sitzungen auf einem Server mit dem Standard-Socket-Namen erstellt. Jetzt können Sie Folgendes tun:

$ tmux ls
name1: 1 windows (created Mon Sep 22 10:34:40 2014) [158x40] (attached)
name2: 1 windows (created Mon Sep 22 10:34:43 2014) [158x40] (attached)

Und Sie sehen alle auf dem Server ausgeführten Sitzungen auf dem Standard-Socket. Sie können einen von ihnen erneut anbringen, indem Sie Folgendes verwenden:

tmux attach -d -s name1

-s gibt den Namen der Sitzung an
-d trennt es vom vorherigen Client (wenn es angehängt ist)

Sie können auch in tmux zwischen Sitzungen wechseln, indem Sie choose-tree Befehl, der standardmäßig dem Tastendruck zugewiesen ist C-s (Präfix + s). Das ist was ich normalerweise tue.

16
gitaarik

Dies passierte mir, als der Ubuntu-Desktop abstürzte und meine Gnome-Terminal-Fenster geschlossen wurden. Ich konnte immer noch sehen, dass der tmux-Prozess ausgeführt wurde (ps aux | grep tmux), Aber aus irgendeinem Grund funktionierten tmux-Befehle nicht, um die vorhandenen Sitzungen aufzulisten. Anscheinend wurde der vorhandene Unix-Socket des noch laufenden tmux-Prozesses nicht gefunden. In diesem Szenario wird das Problem behoben, indem der vorhandene Unix-Socket gesucht und mit dem Flag -S Für tmux angegeben wird. hier ist wie:

Sie können die PID Ihres noch laufenden tmux-Prozesses folgendermaßen ermitteln:

ps -p $(pidof tmux)

Nehmen Sie nun Ihre PID (in meinem Fall 6876) und führen Sie diese aus, um alle offenen Unix-Sockets aufzulisten:

Sudo lsof -Uap 6876

Hoffentlich sehen Sie die Ausgabe so:

COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF   NODE NAME
tmux    6876  abe    3u  unix 0x0000000000000000      0t0 408477 socket
tmux    6876  abe    4u  unix 0x0000000000000000      0t0 408478 socket
tmux    6876  abe    6u  unix 0x0000000000000000      0t0 408479 /tmp/tmux-1000/default

Jetzt können Sie den vorhandenen Unix-Socket in Ihrem tmux-Befehl angeben (mit dem Flag -S), Und Sie sollten in der Lage sein, Sitzungen aufzulisten und ordnungsgemäß anzuhängen:

tmux -S /tmp/tmux-1000/default list-sessions
tmux -S /tmp/tmux-1000/default attach -t 0
15
Abe Voelker

Möglicherweise haben Sie einen Fehler in Ihrem .tmux.conf. Ich hatte dieses Problem, bis ich diese Zeile aus meinem .tmux.conf:

set-window-option -g xterm-keys on

Sie könnten auch versuchen tmux -v und sehen Sie sich dann die Protokolle an, die gedruckt werden.

9
Rose Perrone

Eine einfache Lösung besteht darin, die vom tmux-Server hinterlassenen tmp-Dateien zu löschen, indem Sie beispielsweise $ rm -rf /tmp/tmux-xxx/.

6
Shumin Guo

Die Funktionsweise von TMUX(1) besteht darin, dass ein Client-Prozess (tmux) eine Verbindung zu einem Server-Prozess (tmux, jedoch nicht mit einem TTY verbunden) herstellt, wie in der Abbildung gezeigt folgende ps Ausgabe:

  PID TTY      STAT   TIME COMMAND
19229 pts/1    S+     0:00 tmux
19231 ?        Ss     0:00 tmux

Das zeigt, dass der Client tatsächlich vor dem Server startet (man könnte annehmen, dass er ihn gabelt).


Nach dem Trennen/erneuten Anhängen wird derselbe Befehl ps ausgegeben:

  PID TTY      STAT   TIME COMMAND
19231 ?        Ss     0:00 tmux
19290 pts/1    S+     0:00 tmux attach

Dies zeigt den tmux-Client als tmux attach, dadurch etwas verständlicher.


Wenn wir uns nun die Ausgabe von pstree in beiden oben genannten Fällen ansehen, erhalten wir in beiden Fällen (ignorieren wir die Änderung von pid für tmux attach):

pstree -p
init(1)─┬─acpid(1824)
        ├─cron(1859)
        ⋮
        ├─sh(14146)───tmux(19229)
        └─tmux(19231)───sh(19233)───pstree(19234)

Eindeutiges Anzeigen, dass die Befehle (in diesem Fall pstree) im Client-Prozess (PID 19229) vom Server ausgeführt werden (PID 19231), sodass sie ohne SIGHUP weitermachen können, wenn das Client-Terminal verloren geht (z. B. über ssh).


Nun zu der Frage, die OP gestellt hat: Was passiert, wenn tmuxfailed to connect to server: Connection refused ist, dass der Serverprozess (in unserem Fall pid 19231) nicht erreichbar ist, aus welchem ​​Grund auch immer (es kann sein, dass der Serverprozess abgestorben ist; aber auch, weil der Benutzer, der den tmux -Client ausführt, nicht über die Berechtigungen verfügt um auf die tmux buchse zuzugreifen, etc.)

Die Lösung in diesem Fall besteht darin, grep für die tmux -Prozesse (z. B. über ps) zu verwenden und zu beten, dass Sie diesen Fehler nicht erhalten haben, weil der Server gestorben ist (so) Sie können eine Verbindung herstellen, indem Sie lsof verwenden, um zu ermitteln, welche Sockets abgehört werden. Andernfalls besteht keine Möglichkeit, eine Verbindung zum Server herzustellen , da dieser so tot ist wie nach einem Neustart.


TL; DR:

Dieser Fehler kann aus mehreren Gründen auftreten, von einem Fehler bis zu einem kritischen Fehler (Programm ist abgestorben). Kurz gesagt, verwenden Sie die UNIX-Tools, die Ihnen zur Verfügung stehen, um zu bestimmen, welcher Socket tmux verwendet wird, wenn er noch ausgeführt wird (wenn der tmux-Client ausgeführt wird, sollten mindestens zwei Prozesse vorhanden sein - dies geschieht nach dem Aufrufen von tmux oder tmux attach aus der Shell) und somit, ob Sie Ihre Sitzung verloren haben oder nicht.

Hinweis: Wenn der Grund für die Anzeige dieses Fehlers ein Socket-Fehler ist, können Sie, wie in anderen Antworten angegeben, das -L Flag, um tmux anzuweisen, einen bestimmten Socket zu verwenden.

4
7heo.tk

Ich habe ein anderes Programm innerhalb von tmux verwendet (Reattach-to-User-Namespace) und diese Fehlermeldung erhalten, wenn ich zwischen Computern gewechselt habe, weil Reattach-to-User-Namespace nicht installiert war. Die Lösung bestand darin, einfach brew install reattach-to-user-namespace.

3
akofink

Dies kann passieren, wenn Sie oder ein Reinigungsprozess Dateien in /tmp/* Löschen. Alle Ihre Sitzungsdaten gehen verloren, wenn Sie diese Dateien nicht wiederherstellen können. Das Beenden aller tmux-Instanzen und ein Neustart ist leider die einzige verbleibende Option.

3
Pierre Maoui