Verhindert, dass der GNU-Bildschirm die Sitzung beendet, sobald das Skript beendet ist

34

Ich versuche, den GNU-Bildschirm zu zwingen, ein "virtuelles" Terminal zu erstellen, ohne es anzuhängen, ein Skript im Inneren auszuführen und die Sitzung NICHT zu beenden, sobald das Skript endet.

Ich habe viele Kombinationen ausprobiert, darunter:

screen -dmS udplistener /share/Sys/autorun/start_udp_listeners.sh

oder

screen -S udplistener -X /share/Sys/autorun/start_udp_listeners.sh

und keiner von ihnen arbeitete. Entweder erhalte ich eine Sitzung ohne ausgeführtes Skript, das Skript wird jedoch beendet, sobald die Sitzung beendet ist, oder es wird der Fehler "Keine Bildschirmsitzung gefunden" angezeigt.

Ich versuche im Grunde, den in PHP geschriebenen UDP-Listener auszuführen und ihn in einer Endlosschleife zum Laufen zu bringen (keine Unterbrechungen beim Hören). Ja - ich könnte &am Ende PHP-Skript mit ausführen , wodurch PHP CLI gezwungen wird, als Daemon zu laufen. Das Problem ist, dass ich einen Müll namens Server verwende (QNAP - kaufe niemals diesen Müll!), Der das zu ignorieren scheint. Sobald ich mich von der SSH-Sitzung abmelde, werden die Skripte gestoppt.

So screenscheint die einzige Möglichkeit zu sein. Aber ich kann nicht verstehen, warum es die Sitzung beendet, sobald der ausgeführte Befehl oder das Skript beendet ist.

EDIT : Ich habe auch versucht, Beispiel im Internet zu finden:

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

Kein Mangel! Nachdem screen -R nameich es angehängt habe ( ), sehe ich, dass Midnight Commander NICHT hingerichtet wurde. Obwohl Beispielautor sagte, wird es sein.

trejder
quelle
So wie Sie es aufrufen screen, erstellen Sie nur ein Fenster, um einen einzelnen Befehl auszuführen. Wenn der Befehl beendet wird, wird das Fenster geschlossen und screenhat nichts mehr zu tun, sodass es beendet wird.
JW013,
Also ... gibt es eine Möglichkeit, zwei Fenster zu öffnen (nur über die Befehlszeile, keine Tastenkombinationen), eines zum Ausführen eines Skripts und eines zum Verhindern screendes Schließens? Übrigens: Ich verstehe die Idee immer noch nicht! Wenn ich anrufe screen -dmS name, erstelle ich ein freistehendes Fenster, das auch nichts mehr zu tun hat. Es wird aber nicht automatisch geschlossen! Wenn ich jedoch etwas in diesem getrennten Bildschirm ausführen möchte, wird es beendet, sobald die Ausführung abgeschlossen ist. Warum? Ich sehe hier keine Logik. Kann es sein, dass Fenster nichts tut, aber kann es nicht sein, dass Fenster etwas tut und dann nichts tut?
Trejder
2
Wenn Sie ein Fenster starten , ohne einen Befehl anzugeben, wird es nicht „nichts zu tun“. Das "Etwas", das es tut, ist das Ausführen einer interaktiven Shell, die erst beendet wird, wenn Sie sie manuell beenden.
Jw013
Cool! Danke für eine Erklärung! Also ... zurück zur Frage ... gibt es eine Möglichkeit, einen Befehl in einem getrennten Bildschirm / Fenster auszuführen und diese Sitzung NICHT zu beenden, sobald die Befehlsausführung beendet ist? Schauen Sie sich auch die aktualisierte Frage an. Vielen Dank.
5.
Dieses Skript führt zwei in PHP geschriebene UDP-Listener aus. Obwohl beide als Daemons ausgeführt werden (mit &am Ende), werden sie aufgrund des fehlerhaften Servers (QNAP) beendet, wenn die Sitzung endet (mir wurde gesagt, sie sollten nicht unter normalem Linux ausgeführt werden, wenn sie mit ausgeführt werden &). Daher möchte ich nach start_udp_listeners.shAbschluss der Sitzung nichts weiter tun , als zu verhindern, dass die Sitzung beendet wird. Solange das nicht der Fall ist, funktionieren meine PHP-Listener einwandfrei.
Trejder

Antworten:

42

Um den Bildschirm nach Abschluss des Skripts weiterhin zu beschäftigen, lassen Sie einfach etwas Beständiges in einem Fenster laufen. Die einfachste Wahl für dieses "Etwas" ist wahrscheinlich eine interaktive Shell. Hier ist eine Möglichkeit, dies zu tun bash:

screen -dmS session_name sh -c '/share/Sys/autorun/start_udp_listeners.sh; exec bash'
  • -dm: Startet den Bildschirm im getrennten Modus
  • -S: Setzt den Sitzungsnamen für den Bildschirm, um ihn später leichter abrufen zu können
  • sh -c '...': Anstatt einfach Ihr Skript sh -causzuführen , das beendet wird, verwenden Sie , um mehrere Befehle auszuführen
  • exec bash: Nach dem Beenden des Skripts wechselt das shvon oben auf eine interaktive Shell ( bash), die niemals beendet werden sollte, bis sie von etwas Externem beendet wird. Dies bleibt screenso lange geöffnet, wie die bashInstanz aktiv ist.
jw013
quelle
1
Hm ... scheinbar bist du mein Lebensretter! :] Erweitern Sie Ihre Lösung mit export IGNOREEOF=1, um eine versehentliche Kündigung mit Strg + D zu verhindern. Das sollte mir die perfekte Lösung bieten. Ich habe den ganzen langen Abend gesucht. VIELEN DANK! :]
trejder
Dies funktioniert unter Debian ab heute nicht, -c ist ein Argument, um eine alternative .screenrc-Datei zu lesen ...
ToVine
@ToVine funktioniert perfekt unter Debian Stable (Wheezy). Ich habe es bash -callerdings benutzt.
TranslucentCloud
@TranslucentCloud haben Sie den gesamten Befehl "bash -c ..." in Anführungszeichen gesetzt? Das letzte Mal, als ich es ausprobiert habe (kurz bevor ich den Kommentar geschrieben habe), hat es bei mir nicht ganz
geklappt
@ToVine hier ist mein ganzes Kommando:screen -LS sauf bash -c "sudo aptitude update && sudo aptitude full-upgrade; exec bash"
TranslucentCloud
2

Ich hatte kein Glück mit sh -cmeinem Himbeer-Pi 2, auf dem Debian 7.8 läuft. Aber bash -chat der Job gemacht:

Befehl:

/usr/bin/screen -dmS test-screen bash -c "/usr/bin/top; exec bash"
scotty86
quelle
Könnte dies daran liegen, dass Sie (auf Raspberry Pi) eine andere Shell verwenden? Das bashund shscheint zwei verschiedene Schalen zu sein. Das ist alles, denke ich, aber ich kann mich irren, da ich überhaupt ein Linux-Neuling bin.
Trejder
1
sh ist die Standard-Unix-Shell, sie ist in raspbian (debian) enthalten. Der Befehl sh funktioniert auch, aber nicht sh -c in Kombination mit screen.
Scotty86
Danke @ scotty86 beobachtete ich das gleiche in Linux Mint 19 (Ubuntu 18.04) und Wechsel sh -cauf bash -cden Trick tat. Ich verstehe nicht warum, beide shund bashsind installiert, daher verliere ich immer noch den Schlaf, aber zumindest funktioniert es.
Redsandro
shzeigt wahrscheinlich auf /bin/dashstatt /bin/bash. Debian hat die Standard-Shell von bashvor dashein paar Jahren geändert.
12.