Impedire allo schermo GNU di terminare la sessione al termine dell'esecuzione dello script


35

Sto cercando di forzare lo schermo GNU per creare un terminale "virtuale", senza collegarlo, eseguire lo script all'interno e NON terminare la sessione al termine dello 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. Ricevo una sessione senza script eseguito, lo script viene eseguito, ma la sessione viene terminata al termine o viene visualizzato l'errore "Nessuna sessione schermo trovata".

Quello che sto sostanzialmente cercando di fare è eseguire l'ascoltatore UDP, scritto in PHP e farlo funzionare in loop di infinte (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 e poi mai comprare questa spazzatura!) Che sembra ignorarlo. Non appena disconnetto la sessione SSH, gli script si interrompono.

Quindi screensembra essere l'unica opzione. Ma non riesco a capire, perché termina la sessione una volta eseguito il comando o lo script termina?

EDIT : ho anche provato esempio trovato in Internet:

screen -dmS name
screen -S name -p windowname -X stuff 'mc
'

Nessuna mancanza! Dopo screen -R nameessermi collegato ( ) vedo che il comandante di mezzanotte NON È stato eseguito. Anche se l'autore di esempio ha detto, lo sarà.


Nel modo in cui stai invocando screen, crei solo una finestra per eseguire un singolo comando. Quando il comando termina, la finestra si chiude e screennon rimane più nulla da fare, quindi esce.
jw013,

Quindi ... c'è un modo per aprire due finestre (usando solo la riga di comando, nessuna combinazione di tastiere), una per eseguire uno script e una seconda per impedire la screenchiusura? A proposito: non riesco ancora ad avere l'idea! Se chiamo screen -dmS name, creo una finestra separata, che non ha altro da fare. Ma non si chiude automaticamente! Ma quando voglio eseguire qualcosa in quello schermo separato, termina una volta eseguita l'esecuzione. Perché? Non vedo la logica qui. La finestra può non fare nulla, ma la finestra non può fare qualcosa e quindi non fare nulla?
Trejder,

2
Quando si avvia una finestra senza specificare un comando, è non "fare nulla". Il "qualcosa" che sta facendo è eseguire una shell interattiva, che non si chiude fino a quando non la si esce manualmente.
jw013,

Freddo! Grazie per una spiegazione! Quindi ... tornando alla domanda ... c'è un modo per eseguire un comando all'interno di una schermata / finestra separata e NON per terminare quella sessione, una volta terminata l'esecuzione del comando? Inoltre, dai un'occhiata alla domanda aggiornata. Grazie.
trejder,

Questo script sta eseguendo due listener UDP scritti in PHP. Sebbene entrambi siano eseguiti come demoni (con &alla fine), a causa del buggy server (QNAP), sono chiusi al termine della sessione (mi è stato detto che non dovrebbero essere su Linux normale, se eseguiti con &). Quindi non sto cercando di fare nulla dopo aver start_udp_listeners.shterminato, ma solo come impedire che la sessione venga interrotta. Finché non lo è, i miei ascoltatori PHP funzionano bene.
trejder,

Risposte:


42

Per tenere occupato lo schermo dopo il completamento dello script, basta mantenere qualcosa di persistente in esecuzione in una finestra. La scelta più semplice per quel "qualcosa" è probabilmente una shell interattiva. Ecco un modo per farlo (assumendo bashcome scelta della shell interattiva):

screen -dmS session_name sh -c '/share/Sys/autorun/start_udp_listeners.sh; exec bash'
  • -dm: avvia la schermata in modalità staccata
  • -S: imposta il nome della sessione per lo schermo per un più facile recupero in seguito
  • sh -c '...': invece di semplicemente eseguire il tuo script, che terminerà, usa sh -cper eseguire più comandi
  • exec bash: dopo che lo script termina, il shprecedente passa a una shell interattiva ( bash), che non dovrebbe mai uscire fino a quando qualcosa di esterno lo termina. Questo rimarrà screenaperto fino a quando l' bashistanza sarà viva.

1
Hm ... sembra che tu sia il mio salvatore di vita! :] Estendere la tua soluzione con export IGNOREEOF=1per impedire la chiusura accidentale con Ctrl + D dovrebbe darmi la soluzione perfetta, ho cercato per tutta la serata. GRAZIE! :]
trejder,

Questo non funziona su Debian da oggi, -c è un argomento per leggere un file .screenrc alternativo ...
ToVine

@ToVine funziona perfettamente su Debian Stable (Wheezy). Ho usato bash -cperò.
TranslucentCloud

@TranslucentCloud hai racchiuso tra virgolette l'intero comando "bash -c ..."? L'ultima volta che l'ho provato (proprio prima di scrivere il commento) non ha funzionato per me, non sono sicuro del perché ...
ToVine

@ToVine ecco il mio intero comando:screen -LS sauf bash -c "sudo aptitude update && sudo aptitude full-upgrade; exec bash"
TranslucentCloud

2

Non ho avuto fortuna con sh -cil mio raspberry pi 2 con Debian 7.8. Ma ha bash -cfatto il lavoro:

Comando:

/usr/bin/screen -dmS test-screen bash -c "/usr/bin/top; exec bash"

Potrebbe essere, perché stai usando (su Raspberry Pi) una shell diversa? L' bashe shsembra essere due diverse conchiglie. Questo è tutto, penso, ma potrei sbagliarmi, dal momento che sono un novizio di Linux.
trejder

1
sh è la shell unix predefinita, è inclusa in raspbian (debian). Anche il comando sh funziona, ma non sh -c in combinazione con lo schermo.
scotty86,

Grazie @ scotty86, ho osservato lo stesso in Linux Mint 19 (Ubuntu 18.04) e cambiando sh -cper bash -cfare il trucco. Non capisco perché, entrambi she bashsiano installati, quindi sto ancora perdendo sonno su di esso, ma almeno funziona.
Redsandro,

shprobabilmente indica /bin/dashinvece di /bin/bash. Debian ha cambiato la shell predefinita da basha dashqualche anno fa.
scai,
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.