Sesja tmux została zabita podczas odłączania od ssh

23

Podsumowanie : Próbuję dowiedzieć się, dlaczego moja sesja tmux umiera, kiedy rozłączam się z ssh

Szczegóły :

Mam tmux zainstalowany na systemie Arch Linux. Kiedy rozpoczynam sesję tmux, mogę się od niej odłączyć, a następnie dołączyć ponownie, gdy sesja ssh jest aktywna. Ale jeśli zakończę moją sesję ssh, sesja tmux zostanie zabita.

Wiem, że to nie jest normalne zachowanie, ponieważ mam inny system, w którym sesja tmux kontynuuje działanie, nawet jeśli sesja ssh jest zakończona i mogę nawiązać połączenie z sesją tmux po ustanowieniu nowego połączenia ssh. System, który ma problem i ten, który działa poprawnie, ma bardzo podobne konfiguracje, więc nie jestem pewien, co sprawdzić.

Korzystam z wersji Tmux 1.9a. System, który ma problem (dla którego mam dostęp do roota) ma wersję jądra Linuksa 3.17.4-1, a system, który działa poprawnie, ma wersję jądra 3.16.4-1-ARCH (nie mam roota na tym system). Wątpię jednak, aby źródłem problemu była wersja jądra, zauważyłem tylko jedną różnicę.

Pomyślałem, że zapytam, czy ktoś widział podobny problem i wie o możliwym rozwiązaniu.

Dokładne kroki prowadzące do problemu to:

  1. ssh do maszyny
  2. uruchom, tmuxaby uruchomić tmux
  3. ctrl-B D oderwać (w tym momencie mogłem ponownie się połączyć tmux attach
  4. zamknij sesję ssh (w tym momencie sesja tmux została zabita, mogłem to zaobserwować, gdy jestem zalogowany jako root w innym terminalu)
  5. połącz się ponownie z ssh i uruchom, tmux attacha dostaję komunikat no sessionsi tmux lspowracam failed to connect to server: Connection refused. Ma to sens, ponieważ serw nie działa. Nie ma dla mnie sensu, dlaczego zostaje zabity w kroku 4, kiedy rozłączam się z sesją ssh.

dane śledzenia:

W odpowiedzi na jeden z komentarzy użyłem strace, aby zobaczyć, jakie systemy nazywają proces serwera tmux. Wygląda na to, że kiedy kończę sesję ssh (przez pisanie exitlub za pomocą ctrl-d), proces tmux zostaje zabity. Oto fragment końcowej części wyniku 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 +++

Porównałem to z innym systemem, w którym tmux działa poprawnie i na tym systemie proces tmux kontynuuje działanie nawet po wyjściu z niego. Wydaje się więc, że główną przyczyną jest zakończenie procesu tmux po zamknięciu sesji ssh. Będę musiał poświęcić trochę czasu na rozwiązanie tego problemu, aby dowiedzieć się, dlaczego, ale pomyślałem, że zaktualizuję moje pytanie, ponieważ sugestia śledzenia była przydatna.

Gabriel Southern
źródło
dla pewności, opisz krok po kroku: Zakładam, że jesteś ssh, zaczynasz sesję tmux, odłączasz się od sesji i zamykasz shh: kiedy ponownie ssh, nie masz możliwości ponownego dołączenia do sesji tmix? tj. sesja już nie działa?
Olivier Dulac,
@OlivierDulac tak twoje założenie jest prawidłowe. Zredagowałem również moje pytanie, aby uwzględnić te szczegóły.
Gabriel Southern
jak zamknąć sesję ssh? i możesz dołączyć strid do pid tmux, a drugi do pid sshd, aby zobaczyć, czy coś otrzyma, gdy zamkniesz połączenie ssh (bardzo pełne, przekierowanie do pliku)
Olivier Dulac
@OlivierDulac dzięki za sugestię. Zaktualizowałem pytanie o informacje ze strace. Wygląda na to, że proces serwera tmux ginie, kiedy kończę sesję ssh. Nie sądzę, że tak się powinno stać, więc muszę dowiedzieć się, dlaczego tak się dzieje.
Gabriel Southern
Uruchom tmux z włączonym pełnym rejestrowaniem i sprawdź, czy coś jest drukowane w dzienniku po rozłączeniu. Ponadto, jaki jest TERM na zdalnej maszynie w Tmuxie i poza nim?
jasonwryan

Odpowiedzi:

16

Teoria

Niektóre systemy init, w tym systemd, zapewniają funkcję zabijania wszystkich procesów należących do usługi. Usługa zazwyczaj uruchamia pojedynczy proces, który tworzy więcej procesów przez rozwidlenie i te procesy mogą to zrobić. Wszystkie takie procesy są zwykle uważane za część usługi. W systemd odbywa się to za pomocą cgroups .

W systemd wszystkie procesy należące do usługi są zabijane, gdy usługa jest domyślnie zatrzymana. Serwer SSH jest oczywiście częścią usługi. Gdy łączysz się z serwerem, serwer SSH zwykle rozwidla się, a nowy proces obsługuje sesję SSH. Po przejściu przez proces sesji SSH lub jej potomków uruchamiane są inne procesy po stronie serwera, w tym ekran lub tmux .

Aktywacja trybu Kill i gniazda

Domyślne zachowanie można zmienić za pomocą KillModedyrektywy. Projekt nadrzędny nie zawiera .serviceplików AFAIK, więc różnią się one w zależności od dystrybucji. Istnieją zazwyczaj dwa sposoby włączenia SSH w systemie. Jednym z nich jest klasyk, ssh.servicektóry utrzymuje długo działający demon SSH nasłuchujący w sieci. Drugi polega na aktywacji gniazda obsługiwanej przez to, ssh.socketktóre z kolei się uruchamia, [email protected]które działa tylko dla jednej sesji SSH.

Rozwiązania

Jeśli procesy zostaną zabite pod koniec sesji, możliwe, że używasz aktywacji gniazda i zostanie zabity przez systemd, gdy zauważy, że proces sesji SSH zakończył się. W takim przypadku istnieją dwa rozwiązania. Jednym z nich jest unikanie aktywacji gniazda za pomocą ssh.servicezamiast ssh.socket. Drugim jest ustawienie KillMode=processw Servicesekcji [email protected].

To KillMode=processustawienie może być również przydatne w przypadku klasycznego ssh.service, ponieważ pozwala uniknąć zabijania procesu sesji SSH lub procesów ekranu lub tmux , gdy serwer zostanie zatrzymany lub zrestartowany.

Przyszłe notatki

Ta odpowiedź najwyraźniej zyskała popularność. Chociaż działał on dla OP, może się zdarzyć, że nie zadziała dla kogoś w przyszłości z powodu rozwoju lub konfiguracji systemd-logind . Sprawdź dokumentację dotyczącą sesji logowania, jeśli występują inne zachowania niż opis w tej odpowiedzi.

Pavel Šimerda
źródło
Jakieś konkretne opinie od downvoter czy po prostu trolling?
Pavel Šimerda
3
Dziękuję za szczegółową odpowiedź. Przejście na sshd.service naprawiło problem.
Gabriel Southern
Ten problem występuje w systemie, który używa initraczej niż systemd. Ale i tak jest nieco inaczej, patrz moje pytanie .
gerrit
5

Czy używasz systemd z aktywacją gniazda dla SSH?

Jeśli tak, istnieje znany problem . Według zwolenników systemd jest to w rzeczywistości funkcja - systemd zabija wszystkie procesy powstałe w wyniku sesji po jej zakończeniu. (Widzę, że jest to przydatne, ale w GNU screenlub tmux, na pewno , nie chcesz tego ☺ ani w większości innych przypadków, w których użytkownicy mogą oczywiście uruchamiać procesy w tle).

Jeśli tak, spróbuj przełączyć się z sshd.socketnasshd.service .

mirabilos
źródło
1
Powiedziałbym, że na ogół nie chcesz używać tej funkcji do logowania SSH, jeśli użytkownicy mogą uruchamiać procesy uruchomione po wylogowaniu. Nie dotyczy to screena ani tmuxa, ale raczej SSH (z dowolnymi procesami w tle po stronie serwera).
Pavel Šimerda,
2
@ PavelŠimerda tak, myślałem, że to niejawne, ale zredagowałem post, aby teraz był bardziej wyraźny.
mirabilos
3

Miałem ten sam problem z tmuxem i ekranem na Ubuntu 16.04 (kde neon). Kiedy sesja ssh została odłączona screen / tmux został zakończony.

krótko mówiąc, systemd zmienił swoje domyślne ustawienie na killuserprocess = yes, więc po opuszczeniu sesji ssh każdy utworzony przez nią proces zostanie zakończony.

Łatwa naprawa (po wielu godzinach próbowania) uruchom screen / tmux za pomocą tego polecenia

Na ekranie

systemd-run --scope --user screen

dla Tmux

systemd-run --scope --user tmux

Możesz utworzyć alias, aby to ułatwić

alias tmux= "systemd-run --scope --user tmux"

mrbarletta
źródło
-bash: systemd-run: command not foundna Red Hat Enterprise Linux Server release 6.8 (Santiago).
gerrit
Czy to działa, gdy nie mam roota?
gerrit
1
Zauważyłem, że niepożądane zachowanie tmux / zabijania ekranu nie występuje na Ubuntu 18.04 LTS, tylko 16.04.
Seth
2

Innym rozwiązaniem, aby to, co nie wymaga przejścia od sshd.socketcelu sshd.service, jest uruchomienie tmuxserwera jako Systemd usługi [0]. W ten sposób tmuxserwer jest już uruchomiony, gdy SSH do niego, zamiast odradzać się przez tmuxpolecenie w SSH, więc nie zostanie zabity.

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

Song Gao
źródło
Czy to działa, gdy nie mam roota?
gerrit
Tak, to prawidłowe rozwiązanie. Ale nadal chcesz rozwiązać problem z ponownym uruchomieniem usługi SSH w sesji SSH. :)
Pavel Šimerda
Chłopaki, na wypadek, gdybyście korzystali z OpenRC, stworzyłem skrypt startowy tmux, który robi to samo co plik usługi wymieniony w ArchWiki
Megver83