Snažím se přinutit obrazovku GNU, aby vytvořila „virtuální“ terminál, aniž by se k němu připojila, provedla uvnitř skript a NEUKONČOVALA relaci, jakmile skript skončí.
Vyzkoušel jsem mnoho kombinací, včetně:
screen -dmS udplistener /share/Sys/autorun/start_udp_listeners.sh
nebo
screen -S udplistener -X /share/Sys/autorun/start_udp_listeners.sh
a žádný z nich nefungoval. Buď dostanu relaci bez spuštěného skriptu, skript se spustí, ale relace je po dokončení ukončena, nebo se mi zobrazuje chyba „Nebyla nalezena žádná relace obrazovky“.
V zásadě se snažím spustit posluchač UDP napsaný v PHP a zajistit, aby fungoval v nekonečné smyčce (nepřerušujte poslech). Ano – mohl bych spustit PHP skript s &
na konci vynucení PHP CLI běžet jako démon. Problém je v tom, že používám kus nevyžádané pošty nazývaný server (QNAP – nikdy, nikdy si tuto nevyžádanou poštu nekupujte!), který to zřejmě ignoruje. Jakmile odhlásím relaci SSH, skripty se zastaví.
Takže screen
se zdá být jedinou možností. Ale nechápu, proč to ukončí relaci, jakmile skončí spuštěný příkaz nebo skript?
UPRAVIT :Zkoušel jsem také příklad nalezený na internetu:
screen -dmS name
screen -S name -p windowname -X stuff 'mc
'
Žádný nedostatek! Po připojení k němu (screen -R name
) Vidím, že Midnight Commander NEBYL popraven. Ačkoli autor příkladu řekl, bude.
Přijatá odpověď:
Chcete-li po dokončení skriptu udržet obrazovku zaneprázdněnou, ponechejte v okně něco trvalého spuštěného. Nejjednodušší volbou pro to „něco“ je pravděpodobně interaktivní shell. Zde je jeden způsob, jak to udělat (za předpokladu, že bash
jako volba interaktivního shellu):
screen -dmS session_name sh -c '/share/Sys/autorun/start_udp_listeners.sh; exec bash'
-dm
:spustí obrazovku v odděleném režimu-S
:nastaví název relace pro obrazovku pro snazší pozdější vyhledánísh -c '...'
:místo jednoduchého spuštění skriptu, který se ukončí, použijtesh -c
spustit více příkazůexec bash
:po ukončení skriptush
shora se přepne na interaktivní shell (bash
), který by nikdy neměl opustit, dokud ho něco externího neukončí. Tím zůstanescreen
otevřít tak dlouho, dokudbash
instance je naživu.