Próbuję zmusić ekran GNU do utworzenia „wirtualnego” terminala, bez dołączania się do niego, wykonywania skryptu wewnątrz i NIE kończenia sesji po zakończeniu skryptu.
Próbowałem wielu kombinacji, w tym:
screen -dmS udplistener /share/Sys/autorun/start_udp_listeners.sh
lub
screen -S udplistener -X /share/Sys/autorun/start_udp_listeners.sh
i żaden z nich nie działał. Dostaję sesję bez wykonania skryptu, skrypt jest wykonywany, ale sesja zostaje zakończona po zakończeniu lub pojawia się błąd „Nie znaleziono sesji ekranowej”.
W zasadzie staram się uruchomić program nasłuchujący UDP napisany w PHP i sprawić, by działał w nieskończonej pętli (nie przerywaj nasłuchiwania). Tak - na końcu mogłem uruchomić skrypt PHP &
, zmuszając CLI PHP do działania jako demon. Problem polega na tym, że używam kawałka śmieci zwanego serwerem (QNAP - nigdy, nigdy nie kupuj tego śmieci!), Co wydaje się ignorować. Skoro tylko wyloguję się z sesji SSH, skrypty przestają działać.
Więc screen
wydaje się być jedynym rozwiązaniem. Ale nie rozumiem, dlaczego kończy sesję po zakończeniu wykonania polecenia lub skryptu?
EDYCJA : Próbowałem też znaleźć przykład w Internecie:
screen -dmS name
screen -S name -p windowname -X stuff 'mc
'
Nie brakuje! Po dołączeniu do niego ( screen -R name
) widzę, że dowódca północy NIE ZOSTAŁ stracony. Chociaż przykładowy autor powiedział, że tak będzie.
źródło
screen
tworzysz tylko jedno okno, aby uruchomić jedno polecenie. Kiedy polecenie kończy się, okno zamyka się iscreen
nie ma już nic do zrobienia, więc wychodzi.screen
zamknięciu? BTW: Nadal nie mam pojęcia o tym! Jeśli zadzwonięscreen -dmS name
, tworzę odłączone okno, które również nie ma już nic do roboty. Ale to nie jest automatycznie zamykane! Ale gdy chcę wykonać coś na tym odłączonym ekranie, kończy się po wykonaniu. Czemu? Nie widzę tu logiki. Czy okno może nic nie robić, ale nie może robić okna, a następnie nic nie robić?&
końcem), z powodu błędnego serwera (QNAP), są one przerywane po zakończeniu sesji (powiedziano mi, że nie powinny działać na normalnym Linuksie, jeśli są wykonywane z&
). Więc nie zamierzam nic robić postart_udp_listeners.sh
zakończeniu, tylko jak zapobiec zakończeniu sesji. Dopóki tak nie jest, moi słuchacze PHP działają dobrze.Odpowiedzi:
Aby ekran był zajęty po zakończeniu skryptu, po prostu utrzymuj coś trwałego w oknie. Najprostszym wyborem dla tego „czegoś” jest prawdopodobnie interaktywna powłoka. Oto jeden ze sposobów, aby to zrobić (zakładając, że
bash
jest to wybór interaktywnej powłoki):-dm
: uruchamia ekran w trybie odłączonym-S
: ustawia nazwę sesji dla ekranu, aby ułatwić późniejsze pobieraniesh -c '...'
: zamiast po prostu uruchomić skrypt, który się zakończy, użyjsh -c
do uruchomienia wielu poleceńexec bash
: po zakończeniu skryptush
powyższe przełącza się na interaktywną powłokę (bash
), która nigdy nie powinna wyjść, dopóki coś zewnętrznego go nie zakończy. Będzie toscreen
otwarte, dopókibash
instancja będzie żywa.źródło
export IGNOREEOF=1
aby zapobiec przypadkowemu zakończeniu z Ctrl + D, powinno dać mi idealne rozwiązanie, szukałem cały długi wieczór. DZIĘKI! :]bash -c
jednak.screen -LS sauf bash -c "sudo aptitude update && sudo aptitude full-upgrade; exec bash"
Nie miałem szczęścia
sh -c
na moim Raspberry Pi 2 z systemem Debian 7.8. Alebash -c
czy praca:Dowództwo:
źródło
bash
Ish
wydaje się być dwa różne muszle. Myślę, że to wszystko, ale mogę się mylić, ponieważ w ogóle jestem nowicjuszem w Linuksie.sh -c
siębash -c
załatwiło sprawę. Nie rozumiem dlaczego, obash
ibash
są zainstalowane, więc wciąż nie mogę się nad tym przespać, ale przynajmniej działa.sh
prawdopodobnie wskazuje/bin/dash
zamiast/bin/bash
. Debian zmienił domyślną powłokę zbash
nadash
kilka lat temu.