Zusammenfassung : Ich versuche herauszufinden, warum meine tmux-Sitzung abbricht, wenn ich die Verbindung zu ssh trenne
Details :
Ich habe tmux auf einem Arch Linux-System installiert. Wenn ich eine tmux-Sitzung starte, kann ich mich von ihr trennen und erneut eine Verbindung herstellen, während die ssh-Sitzung aktiv ist. Aber wenn ich meine ssh-Sitzung beende, wird die tmux-Sitzung beendet.
Ich weiß, dass dies nicht das normale Verhalten ist, da die tmux-Sitzung auf einem anderen System weiterläuft, auch wenn die ssh-Sitzung beendet ist und ich nach dem Herstellen einer neuen ssh-Verbindung eine Verbindung zur tmux-Sitzung herstellen kann. Das System, bei dem ein Problem vorliegt, und das System, das ordnungsgemäß funktioniert, weisen sehr ähnliche Konfigurationen auf, sodass ich nicht sicher bin, was zu überprüfen ist.
Ich verwende TMUX Version 1.9a. Das System, auf dem ein Problem vorliegt (für das ich root-Zugriff habe), hat eine Linux-Kernelversion von 3.17.4-1, und das System, das ordnungsgemäß funktioniert, hat die Kernelversion 3.16.4-1-ARCH (auf der ich kein root habe) System). Ich bezweifle, dass die Kernel-Version die Ursache des Problems ist, das ist nur ein Unterschied, den ich bemerkt habe.
Ich dachte, ich würde fragen, ob jemand ein ähnliches Problem gesehen hat und eine mögliche Lösung kennt.
Die genauen Schritte, die zu dem Problem führen, sind:
- ssh zu bearbeiten
- laufe
tmux
um tmux zu starten ctrl-B D
zu lösen (an dieser stelle konnte ich mich wieder anschließen mittmux attach
- Schließen Sie die SSH-Sitzung
- verbinde
tmux attach
dich wieder mit ssh und renne und ich bekomme die nachrichtno sessions
und laufetmux ls
zurückfailed to connect to server: Connection refused
. Dies ist sinnvoll, da der Aufschlag nicht ausgeführt wird. Was für mich keinen Sinn ergibt, ist, warum es in Schritt 4 beendet wird, wenn ich mich von der SSH-Sitzung trenne.
Dehnungsdaten:
Als Antwort auf einen der Kommentare habe ich strace verwendet, um zu sehen, welche Systeme der TMUX-Serverprozess aufruft. Es sieht so aus, als würde der tmux-Prozess beendet, wenn ich meine ssh-Sitzung beende (durch Tippen exit
oder mit ctrl-d
). Hier ist ein Ausschnitt aus dem letzten Teil der Ausgabe von strace.
poll([{fd=4, events=POLLIN}, {fd=11, events=POLLIN}, {fd=6, events=POLLIN}], 3, 424) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
--- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=1, si_uid=0} ---
sendto(3, "\17", 1, 0, NULL, 0) = 1
+++ killed by SIGKILL +++
Ich habe dies mit einem anderen System verglichen, auf dem tmux ordnungsgemäß funktioniert, und auf diesem System läuft der tmux-Prozess auch nach dem Beenden weiter. Die Hauptursache scheint zu sein, dass der tmux-Prozess beendet wird, wenn ich die ssh-Sitzung beende. Ich muss einige Zeit mit der Fehlersuche verbringen, um herauszufinden, warum, aber ich dachte, ich würde meine Frage aktualisieren, da der Strace-Vorschlag nützlich war.
Antworten:
Theorie
Einige Init-Systeme, einschließlich systemd, bieten eine Funktion zum Beenden aller zum Dienst gehörenden Prozesse. Der Dienst startet normalerweise einen einzelnen Prozess, der durch Verzweigen mehr Prozesse erzeugt, und diese Prozesse können dies ebenfalls tun. Alle diese Prozesse werden normalerweise als Teil des Service betrachtet. In systemd geschieht dies mit cgroups .
In systemd werden alle zu einem Dienst gehörenden Prozesse abgebrochen, wenn der Dienst standardmäßig gestoppt wird. Der SSH-Server ist offensichtlich Teil des Dienstes. Wenn Sie eine Verbindung zum Server herstellen, wird der SSH-Server normalerweise verzweigt und der neue Prozess verarbeitet Ihre SSH-Sitzung. Durch das Verlassen des SSH-Sitzungsprozesses oder seiner untergeordneten Prozesse werden andere serverseitige Prozesse gestartet, einschließlich Ihres Bildschirms oder von tmux .
Killmode und Socket Aktivierung
Das Standardverhalten kann mithilfe der
KillMode
Direktive geändert werden . Das vorgelagerte Projekt enthält keine AFAIK-.service
Dateien und daher variieren diese je nach Verteilung. Normalerweise gibt es zwei Möglichkeiten, SSH auf Ihrem System zu aktivieren. Einer davon ist der Klassikerssh.service
, der einen lang laufenden SSH-Daemon unterhält, der im Netzwerk empfangsbereit ist. Die andere wird über die Socket-Aktivierung abgewickelt, diessh.socket
wiederum gestartet wird[email protected]
und nur für eine einzelne SSH-Sitzung ausgeführt wird.Lösungen
Wenn Ihre Prozesse am Ende der Sitzung abgebrochen werden, verwenden Sie möglicherweise die Socket-Aktivierung, und systemd bricht sie ab, wenn es feststellt, dass der SSH-Sitzungsprozess beendet wurde. In diesem Fall gibt es zwei Lösungen. Eine Möglichkeit besteht darin, die Verwendung der Socket-Aktivierung durch Verwendung von
ssh.service
anstelle von zu vermeidenssh.socket
. Das andere istKillMode=process
imService
Abschnitt von einzustellen[email protected]
.Die
KillMode=process
Einstellung kann auch für den Klassiker nützlich seinssh.service
, da der SSH-Sitzungsprozess oder der Bildschirm- oder tmux- Prozess nicht beendet werden, wenn der Server gestoppt oder neu gestartet wird.Zukünftige Notizen
Diese Antwort hat anscheinend an Popularität gewonnen. Während es für das OP funktionierte, kann es vorkommen, dass es aufgrund der Entwicklung oder Konfiguration von systemd-logind in der Zukunft für niemanden funktioniert . Bitte überprüfen Sie die Dokumentation zu den Anmeldesitzungen, wenn Sie ein Verhalten feststellen, das von der Beschreibung in dieser Antwort abweicht.
quelle
init
alssystemd
. Aber es ist trotzdem etwas anders, siehe meine Frage .Verwenden Sie systemd mit Socket-Aktivierung für SSH?
Wenn ja, gibt es ein bekanntes Problem . Laut den systemd-Befürwortern handelt es sich tatsächlich um eine Funktion - systemd bricht alle Prozesse ab, die von einer Sitzung beim Beenden der Sitzung ausgelöst werden. (Ich sehe, dass dies nützlich ist, aber in der GNU
screen
oder intmux
bestimmten Fällen möchten Sie dies definitiv nicht. In den meisten anderen Fällen können Benutzer natürlich Hintergrundprozesse ausführen.)Wenn ja, wechseln Sie von
sshd.socket
zusshd.service
.quelle
Ich hatte das gleiche Problem mit tmux und screen unter Ubuntu 16.04 (kde neon). Wenn die SSH-Sitzung getrennt wurde, wurde screen / tmux beendet.
Kurz gesagt, systemd hat seine Standardeinstellung in killuserprocess = yes geändert, sodass nach dem Verlassen einer ssh-Sitzung jeder von ihr erstellte Prozess beendet wird.
Einfache Lösung (nach stundenlangem Ausprobieren): Führen Sie screen / tmux mit diesem Befehl aus
Für Bildschirm
systemd-run --scope --user screen
für Tmux
systemd-run --scope --user tmux
Sie können einen Alias erstellen, um dies zu vereinfachen
alias tmux= "systemd-run --scope --user tmux"
quelle
-bash: systemd-run: command not found
aufRed Hat Enterprise Linux Server release 6.8 (Santiago)
.Eine andere Lösung für dieses Problem, bei der kein Wechsel von
sshd.socket
zu erforderlichsshd.service
ist, besteht darin, dentmux
Server als systemd-Dienst [0] zu starten . Auf diese Weise wird dertmux
Server bereits ausgeführt, wenn Sie SSH auf den Server ausführen, anstatt durch dentmux
Befehl in SSH erzeugt zu werden, und wird daher nicht getötet.[0] https://wiki.archlinux.org/index.php/tmux#Autostart_with_systemd
quelle
Die beste Antwort, IMO, die ich gefunden habe, finden Sie unter "Abmelden von tmux-Sitzung beenden" :
Diese "Funktion" gab es bereits in
systemd
früheren Versionen, aber diesystemd
Entwickler beschlossen, eine Änderung der Standardeinstellungen vorzunehmen , um die Einstellung zum Beenden von untergeordneten Prozessen beim Abmelden von einer Sitzung zu aktivieren.Sie können diese Einstellung in Ihrem
logind.conf
(/etc/systemd/logind.conf
) zurücksetzen :quelle