Sto cercando di forzare lo schermo GNU a creare un terminale "virtuale", senza collegarlo ad esso, eseguire lo script all'interno e NON terminare la sessione una volta terminato lo script.
Ho provato molte combinazioni, tra cui:
screen -dmS udplistener /share/Sys/autorun/start_udp_listeners.sh
o
screen -S udplistener -X /share/Sys/autorun/start_udp_listeners.sh
e nessuno di loro ha funzionato. O ricevo la sessione senza lo script eseguito, lo script viene eseguito, ma la sessione viene terminata al termine o viene visualizzato l'errore "Nessuna sessione dello schermo trovata".
Quello che sto fondamentalmente cercando di fare è eseguire il listener UDP, scritto in PHP e farlo funzionare in loop infinito (non interrompere l'ascolto). Sì — potrei eseguire lo script PHP con &
alla fine, forzando l'esecuzione della CLI PHP come demone. Il problema è che sto usando un pezzo di spazzatura chiamato server (QNAP - mai, mai comprare questa spazzatura!) Che sembra ignorarlo. Non appena esco dalla sessione SSH, gli script si interrompono.
Quindi screen
sembra essere l'unica opzione. Ma non riesco a capire, perché termina la sessione una volta eseguito il comando o lo script termina?
MODIFICA :Ho anche provato un esempio trovato in Internet:
screen -dmS name
screen -S name -p windowname -X stuff 'mc
'
Nessuna mancanza! Dopo averlo allegato (screen -R name
) Vedo che il comandante di mezzanotte NON È stato giustiziato. Anche se l'autore dell'esempio ha detto, lo sarà.
Risposta accettata:
Per mantenere lo schermo occupato dopo il completamento dello script, mantieni qualcosa di persistente in esecuzione in una finestra. La scelta più semplice per quel "qualcosa" è probabilmente una shell interattiva. Ecco un modo per farlo (supponendo che bash
come la scelta della shell interattiva):
screen -dmS session_name sh -c '/share/Sys/autorun/start_udp_listeners.sh; exec bash'
-dm
:avvia lo schermo in modalità staccata-S
:imposta il nome della sessione per lo schermo per un più facile recupero in seguitosh -c '...'
:invece di eseguire semplicemente il tuo script, che terminerà, usash -c
per eseguire più comandiexec bash
:dopo che lo script è terminato,sh
dall'alto passerà a una shell interattiva (bash
), che non dovrebbe mai uscire finché qualcosa di esterno non lo termina. Ciò manterrà loscreen
aperto finchébash
l'istanza è viva.