Ich versuche, den GNU-Bildschirm zu zwingen, ein „virtuelles“ Terminal zu erstellen, ohne daran anzuhängen, das Skript darin 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 funktionierte. Entweder erhalte ich eine Sitzung ohne ausgeführtes Skript, das Skript wird ausgeführt, aber die Sitzung wird beendet, sobald sie beendet ist, oder ich erhalte die Fehlermeldung „Keine Bildschirmsitzung gefunden“.
Was ich im Grunde versuche, ist, einen in PHP geschriebenen UDP-Listener auszuführen und ihn in einer Endlosschleife zum Laufen zu bringen (hören nicht unterbrechen). Ja – ich könnte ein PHP-Skript mit &
ausführen am Ende, wodurch die PHP-CLI gezwungen wird, als Daemon ausgeführt zu werden. Das Problem ist, dass ich ein Stück Müll namens Server verwende (QNAP – niemals, niemals diesen Müll kaufen!), der dies anscheinend ignoriert. Sobald ich mich von der SSH-Sitzung abmelde, stoppt das Skript.
Also screen
scheint die einzige Möglichkeit zu sein. Aber ich kann nicht verstehen, warum die Sitzung beendet wird, sobald der ausgeführte Befehl oder das Skript endet?
BEARBEITEN :Ich habe auch versucht, ein Beispiel aus dem Internet zu finden:
screen -dmS name
screen -S name -p windowname -X stuff 'mc
'
Kein Mangel! Nach dem Anhängen (screen -R name
) Ich sehe, dass Midnight Commander NICHT hingerichtet wurde. Obwohl der Beispielautor sagte, dass es so sein wird.
Akzeptierte Antwort:
Um den Bildschirm nach Abschluss des Skripts beschäftigt zu halten, lassen Sie einfach etwas Dauerhaftes in einem Fenster laufen. Die einfachste Wahl für dieses „Etwas“ ist wahrscheinlich eine interaktive Shell. Hier ist eine Möglichkeit, dies zu tun (vorausgesetzt, bash
als Wahl der interaktiven Shell):
screen -dmS session_name sh -c '/share/Sys/autorun/start_udp_listeners.sh; exec bash'
-dm
:Startbildschirm im getrennten Modus-S
:Legt den Sitzungsnamen für den Bildschirm fest, um ihn später leichter wiederzufindensh -c '...'
:Anstatt einfach Ihr Skript auszuführen, das beendet wird, verwenden Siesh -c
um mehrere Befehle auszuführenexec bash
:Nachdem das Skript beendet ist, wird dersh
von oben wechselt zu einer interaktiven Shell (bash
), die niemals beendet werden sollte, bis sie durch etwas Externes beendet wird. Dadurch bleibtscreen
erhalten solange öffnen wie diebash
Instanz lebt.