Perché SSH -t non attende i processi in background?


13

Perché ssh -tnon attende il completamento dei processi in background?

Esempio:

ssh user@example 'sleep 2 &'

Funziona come previsto, poiché ssh ritorna dopo 2 secondi, mentre

ssh user@example -t 'sleep 2 &'

non aspetta il sleeptermine e ritorna immediatamente.

Qualcuno può spiegare il motivo dietro questo? C'è un modo per ssh -tattendere che finiscano tutti i processi in background prima di tornare?

Il mio caso d'uso è che inizio uno script ssh -te questo script avvia diversi processi in background che dovrebbero rimanere in vita al termine dello script principale. Con ssh -tquesto non è possibile finora.

Risposte:


22

Senza -t, sshdottiene lo stdout della shell remota (e piace ai bambini sleep) e stderr tramite due pipe (e invia anche l'input del client tramite un'altra pipe).

sshd attende il processo in cui è stata avviata la shell di accesso dell'utente, ma anche, dopo che quel processo è terminato, attende la fine di eof sulla pipe stdout (non almeno la pipe stderr nel caso di openssh).

Eof si verifica quando non esiste alcun descrittore di file da parte di alcun processo aperto all'estremità di scrittura della pipe, che in genere accade solo quando tutti i processi che non hanno il loro stdout reindirizzato a qualcos'altro sono andati.

Quando si utilizza -t, sshdnon utilizza i tubi. Invece, tutte le interazioni (stdin, stdout, stderr) con la shell remota e i suoi figli sono fatte usando una coppia pseudo-terminale.

Con una coppia pseudo-terminale, per sshdinteragire con il lato master, non esiste una gestione eof simile o alcun modo per sapere se ci sono ancora processi con fds aperti sul lato slave dello pseudo-terminale, quindi attende solo la fine di il processo in cui ha eseguito la shell di accesso dell'utente remoto e quindi si chiude.

All'uscita, il lato master della coppia pty viene chiuso, il che significa che il pty viene distrutto, quindi i processi controllati dallo slave riceveranno un SIGHUP (che per impostazione predefinita li terminerebbe).


1
grazie per la risposta esaustiva! un'altra cosa che vorrei sapere: tutti i processi in background terminano quando esce lo pseudo terminale? lo script che sto iniziando avvia un servizio, che funziona bene con ssh. ma quando si utilizza ssh -t, il servizio non viene avviato. sembra che il servizio venga chiuso quando ritorna ssh.
Philipp Murry,

In realtà, esiste un modo per il lato master di uno pseudo-terminale di sapere quando tutti i descrittori di file slave sono stati chiusi. È lo stesso meccanismo innescato da un vero terminale quando in realtà tutti i descrittori di file sono stati chiusi.
JdeBP,


@JdeBP, ti andrebbe di espandersi? Non sono sicuro di cosa intendi. Gli emulatori di terminali AFAICT (almeno xterm e gnome-terminal) non si preoccupano dei processi che hanno ancora i fds aperti allo slave quando il processo hanno eseguito il guscio in die
Stéphane Chazelas,

@PhilippMurry È possibile utilizzare nohupper mantenere uno script in esecuzione in questo modo. (Potresti anche prendere in considerazione l'avvio di lavori di lunga durata all'interno di in tmuxmodo da poter monitorare i loro progressi in modo interattivo, ma un file di registro funziona bene.)
jpaugh

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.