Die tmux-Sitzung wurde beendet, als die Verbindung zu ssh getrennt wurde

23

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:

  1. ssh zu bearbeiten
  2. laufe tmuxum tmux zu starten
  3. ctrl-B D zu lösen (an dieser stelle konnte ich mich wieder anschließen mit tmux attach
  4. Schließen Sie die SSH-Sitzung
  5. verbinde tmux attachdich wieder mit ssh und renne und ich bekomme die nachricht no sessionsund laufe tmux lszurück failed 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 exitoder 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.

Gabriel Southern
quelle
Um sicher zu gehen, beschreiben Sie bitte Schritt für Schritt: Ich nehme an, Sie starten eine tmux-Sitzung, trennen sich von der Sitzung und schließen die shh: Wenn Sie wieder ssh, haben Sie keine Möglichkeit, wieder an der tmix-Sitzung teilzunehmen? dh die Sitzung läuft nicht mehr?
Olivier Dulac
@OlivierDulac ja deine annahme ist richtig. Ich habe meine Frage auch so bearbeitet, dass sie diese Details enthält.
Gabriel Southern
Wie schließen Sie die SSH-Sitzung? und Sie könnten eine Linie an die pid von tmux und eine andere an die pid von sshd anhängen, um zu sehen, ob sie etwas empfängt, wenn Sie die ssh-Verbindung schließen (sehr ausführlich, zu einer Datei umleiten)
Olivier Dulac
@OlivierDulac danke für den Vorschlag. Ich habe die Frage mit Informationen von strace aktualisiert. Es sieht so aus, als würde der TMUX-Server-Prozess beendet, wenn ich die SSH-Sitzung beende. Ich glaube nicht, dass das passieren soll, also muss ich herausfinden, warum es passiert.
Gabriel Southern
Starten Sie tmux mit aktivierter ausführlicher Protokollierung und prüfen Sie, ob beim Trennen der Verbindung etwas im Protokoll gedruckt wird. Wie lautet der TERM auf dem Remote-Computer in und außerhalb von tmux?
Jasonwryan

Antworten:

16

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 KillModeDirektive geändert werden . Das vorgelagerte Projekt enthält keine AFAIK- .serviceDateien und daher variieren diese je nach Verteilung. Normalerweise gibt es zwei Möglichkeiten, SSH auf Ihrem System zu aktivieren. Einer davon ist der Klassiker ssh.service, der einen lang laufenden SSH-Daemon unterhält, der im Netzwerk empfangsbereit ist. Die andere wird über die Socket-Aktivierung abgewickelt, die ssh.socketwiederum 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.serviceanstelle von zu vermeiden ssh.socket. Das andere ist KillMode=processim ServiceAbschnitt von einzustellen [email protected].

Die KillMode=processEinstellung kann auch für den Klassiker nützlich sein ssh.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.

Pavel Šimerda
quelle
Irgendwelche spezifischen Rückmeldungen vom Downvoter oder nur Trolling?
Pavel Šimerda
3
Danke für die ausführliche Antwort. Der Wechsel zu sshd.service hat das Problem behoben.
Gabriel Southern
Ich habe dieses Problem eher auf einem System mit initals systemd. Aber es ist trotzdem etwas anders, siehe meine Frage .
Gerrit
5

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 screenoder in tmuxbestimmten 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.socketzusshd.service .

Mirabilos
quelle
1
Ich würde sagen, dass Sie diese Funktion im Allgemeinen nicht für SSH-Anmeldungen verwenden möchten, wenn Ihre Benutzer Prozesse ausführen dürfen, die nach dem Abmelden ausgeführt werden. Das ist nicht spezifisch für screen oder tmux, sondern für SSH (mit Hintergrundprozessen auf der Serverseite).
Pavel Šimerda
2
@ PavelŠimerda ja, das habe ich implizit gedacht, aber den Beitrag bearbeitet, um es jetzt deutlicher zu machen.
Mirabilos
3

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"

Mrbarletta
quelle
-bash: systemd-run: command not foundauf Red Hat Enterprise Linux Server release 6.8 (Santiago).
Gerrit
Funktioniert das, wenn ich keine Wurzel habe?
Gerrit
1
Ich habe festgestellt, dass das unerwünschte Tmux / Screen-Killing-Verhalten unter Ubuntu 18.04 LTS nicht auftritt, sondern nur unter 16.04.
Seth
2

Eine andere Lösung für dieses Problem, bei der kein Wechsel von sshd.socketzu erforderlich sshd.serviceist, besteht darin, den tmuxServer als systemd-Dienst [0] zu starten . Auf diese Weise wird der tmuxServer bereits ausgeführt, wenn Sie SSH auf den Server ausführen, anstatt durch den tmuxBefehl in SSH erzeugt zu werden, und wird daher nicht getötet.

[0] https://wiki.archlinux.org/index.php/tmux#Autostart_with_systemd

Song Gao
quelle
Funktioniert das, wenn ich keine Wurzel habe?
Gerrit
Ja, das ist eine gültige Lösung. Sie möchten den Fall dennoch lösen, indem Sie den SSH-Dienst über eine SSH-Sitzung neu starten. :)
Pavel Šimerda
Jungs, falls Sie OpenRC verwenden, machte ich eine tmux Init - Skript , dass die gleiche Funktion wie die Servicedatei im ArchWiki erwähnt
Megver83
1

Die beste Antwort, IMO, die ich gefunden habe, finden Sie unter "Abmelden von tmux-Sitzung beenden" :

Diese "Funktion" gab es bereits in systemdfrüheren Versionen, aber die systemdEntwickler 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 :

KillUserProcesses=no
Jonathan
quelle