sessione tmux interrotta durante la disconnessione da ssh


23

Riepilogo : sto cercando di capire perché la mia sessione di tmux muore quando mi disconnetto da ssh

Dettagli :

Ho tmux installato su un sistema Arch Linux. Quando inizio una sessione di tmux posso staccarmi da essa e quindi ricollegarmi mentre la sessione ssh è attiva. Ma se finisco la mia sessione ssh, la sessione tmux viene uccisa.

So che questo non è il comportamento normale perché ho un altro sistema in cui la sessione tmux continua a funzionare anche se la sessione ssh è terminata e posso collegarmi alla sessione tmux dopo aver stabilito una nuova connessione ssh. Il sistema che presenta un problema e quello che funziona correttamente hanno configurazioni molto simili, quindi non sono sicuro di cosa controllare.

Sto eseguendo tmux versione 1.9a. Il sistema che ha un problema (per il quale ho accesso root) ha una versione del kernel Linux 3.17.4-1 e il sistema che funziona correttamente ha la versione 3.16.4-1-ARCH del kernel (non ho root su quello sistema). Dubito che la versione del kernel sia la fonte del problema, questa è solo una differenza che ho notato.

Ho pensato di chiedere se qualcuno avesse riscontrato un problema simile e fosse a conoscenza di una possibile soluzione.

I passaggi precisi che portano al problema sono:

  1. ssh alla macchina
  2. corri tmuxper avviare tmux
  3. ctrl-B D per staccare (a questo punto potrei ricollegarmi con tmux attach
  4. chiudi sessione ssh (a questo punto la sessione tmux viene interrotta, sono stato in grado di osservarlo quando ho effettuato l'accesso come root in un altro terminale)
  5. riconnettersi con ssh ed eseguire tmux attache ottengo il messaggio no sessionse tmux lsritorna in esecuzione failed to connect to server: Connection refused. Questo ha senso perché il servizio non è in esecuzione. Ciò che non ha senso per me è il motivo per cui viene ucciso nel passaggio 4 quando mi disconnetto dalla sessione SSH.

dati strace:

In risposta a uno dei commenti ho usato strace per vedere quali sistemi chiama il processo del server tmux. Quando esco dalla mia sessione ssh (digitando exito con ctrl-d) sembra che il processo tmux venga interrotto. Ecco uno snippet della parte finale dell'output di 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 +++

Ho confrontato questo con un sistema diverso in cui tmux funziona correttamente e su quel sistema il processo tmux continua a funzionare anche dopo l'uscita. Quindi la causa principale sembra essere che il processo tmux si sta chiudendo quando chiudo la sessione ssh. Dovrò dedicare un po 'di tempo alla risoluzione dei problemi per capire perché, ma ho pensato di aggiornare la mia domanda poiché il suggerimento per lo strace era utile.


per sicurezza, descrivi passo dopo passo: presumo che tu abbia ssh, avvii una sessione di tmux, stacchi dalla sessione e chiuda lo shh: quando ripeti di nuovo, non hai modo di unirti nuovamente alla sessione di tmix? cioè, la sessione non è più in esecuzione?
Olivier Dulac il

@OlivierDulac sì, la tua ipotesi è corretta. Ho anche modificato la mia domanda per includere questi dettagli.
Gabriel Southern,

come si chiude la sessione ssh? e potresti collegare uno straccio al pid di tmux e un altro al pid di sshd, per vedere se riceve qualcosa quando chiudi la connessione ssh (molto dettagliata, reindirizza a un file)
Olivier Dulac il

@OlivierDulac grazie per il suggerimento. Ho aggiornato la domanda con informazioni da Strace. Sembra che il processo di tmux server venga ucciso quando finisco la sessione di ssh. Non penso che dovrebbe succedere, quindi devo capire perché sta accadendo.
Gabriel Southern,

Avviare tmux con la registrazione dettagliata abilitata e vedere se qualcosa viene stampato nel registro quando ci si disconnette. Inoltre, qual è il TERM sulla macchina remota dentro e fuori di tmux?
Jasonwryan,

Risposte:


16

Teoria

Alcuni sistemi init, incluso systemd, forniscono una funzionalità per interrompere tutti i processi appartenenti al servizio. Il servizio in genere avvia un singolo processo che crea più processi mediante il fork e anche quei processi possono farlo. Tutti questi processi sono generalmente considerati parte del servizio. In systemd questo viene fatto usando cgroups .

In systemd, tutti i processi appartenenti a un servizio vengono interrotti quando il servizio viene arrestato per impostazione predefinita. Il server SSH fa ovviamente parte del servizio. Quando ci si connette al server, il server SSH in genere esegue il fork e il nuovo processo gestisce la sessione SSH. Effettuando il fork dal processo di sessione SSH o dai relativi figli, vengono avviati altri processi lato server, incluso lo schermo o tmux .

Killmode e attivazione socket

Il comportamento predefinito può essere modificato utilizzando la KillModedirettiva. Il progetto a monte non include AFAIK alcun .servicefile e quindi questi variano in base alla distribuzione. Esistono in genere due modi per abilitare SSH sul proprio sistema. Uno è il classico ssh.serviceche mantiene un demone SSH in esecuzione da lungo tempo in ascolto sulla rete. L'altro è tramite l'attivazione del socket gestita da quella ssh.socketche a sua volta inizia, sshd@.serviceche viene eseguita solo per una singola sessione SSH.

soluzioni

Se i tuoi processi vengono uccisi al termine della sessione, è possibile che tu stia utilizzando l'attivazione socket e viene ucciso da systemd quando nota che il processo della sessione SSH è terminato. In quel caso ci sono due soluzioni. Uno è di evitare di utilizzare l'attivazione tramite socket ssh.serviceinvece di ssh.socket. L'altro è quello di impostare KillMode=processnella Servicesezione di ssh@.service.

L' KillMode=processimpostazione può anche essere utile con il classico ssh.service, in quanto evita di uccidere il processo della sessione SSH o i processi di schermo o tmux quando il server viene arrestato o riavviato.

Note future

Questa risposta apparentemente ha guadagnato un livello di popolarità. Mentre ha funzionato per l'OP potrebbe accadere che in futuro non funzioni per qualcuno a causa dello sviluppo o della configurazione di systemd-logind . Controlla la documentazione sulle sessioni di logind se riscontri comportamenti diversi dalla descrizione in questa risposta.


Qualche feedback specifico da parte del downvoter o semplicemente la pesca a traina?
Pavel Šimerda,

3
Grazie per la risposta dettagliata. Il passaggio a sshd.service ha risolto il problema.
Gabriel Southern,

Ho riscontrato questo problema su un sistema che utilizza initanziché systemd. Ma è leggermente diverso, vedi la mia domanda .
Gerrit,

5

Usi systemd con l'attivazione socket per SSH?

In tal caso, esiste un problema noto . Secondo i sostenitori di systemd, questa è in realtà una caratteristica: systemd uccide tutti i processi generati da una sessione al termine della sessione. (Posso vedere che è utile, ma nella GNU screen, o tmux, nel caso, sicuramente non lo vuoi ☺ né nella maggior parte degli altri casi in cui gli utenti possono eseguire processi in background, ovviamente.)

In tal caso, prova a passare da sshd.socketasshd.service .


1
Direi che in genere non si desidera utilizzare questa funzione per gli accessi SSH se agli utenti è consentito eseguire processi in esecuzione dopo la disconnessione. Non è specifico per screen o tmux ma piuttosto per SSH (con qualsiasi processo in background sul lato server).
Pavel Šimerda,

2
@ PavelŠimerda sì, lo pensavo implicito, ma ho modificato il post per renderlo più esplicito ora.
mirabilos,

3

Avevo lo stesso problema con tmux e schermo su Ubuntu 16.04 (kde neon). Quando la sessione ssh è stata disconnessa screen / tmux è stato terminato.

per farla breve, systemd ha modificato le impostazioni predefinite in killuserprocess = yes, quindi dopo aver lasciato una sessione ssh ogni processo creato da essa verrà terminato.

Correzione semplice (dopo ore di tentativi) esegui screen / tmux usando questo comando

Per lo schermo

systemd-run --scope --user screen

per Tmux

systemd-run --scope --user tmux

Puoi creare un alias per renderlo più semplice

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


-bash: systemd-run: command not foundsu Red Hat Enterprise Linux Server release 6.8 (Santiago).
Gerrit,

Funziona quando non ho root?
Gerrit,

1
Ho notato che il comportamento indesiderato di uccisione di tmux / schermo non si verifica su Ubuntu 18.04 LTS, solo 16.04.
Seth

2

Un'altra soluzione a questo, che non richiede il passaggio da sshd.socketa sshd.service, è avviare il tmuxserver come un servizio systemd [0]. In questo modo, il tmuxserver è già in esecuzione quando si SSH nel server, anziché generato dal tmuxcomando in SSH, quindi non verrà ucciso.

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


Funziona quando non ho root?
Gerrit,

Sì, questa è una soluzione valida. Ma vuoi ancora risolvere il caso con il riavvio del servizio SSH sulla sessione SSH. :)
Pavel Šimerda,

Ragazzi, se usate OpenRC, ho creato un tmux initscript che fa lo stesso del file di servizio menzionato in ArchWiki
Megver83

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.