Jak wykonać polecenie na ekranie i odłączyć?

75

Jak mogę uzyskać ekran, aby wykonać polecenie, a następnie go odłączyć (to znaczy automatycznie w jednym skrypcie bez dalszych danych wejściowych poza początkowym uruchomieniem skryptu)? np. uruchamiam myscript.sh i automatycznie uruchamia sesję ekranu, wykonuje polecenie, a następnie odłącza się.

Darkfeline
źródło

Odpowiedzi:

114

To jest proste:

screen -d -m yourcommand
Alan Curry
źródło
4
nie ma kości. Polecenie screen -d -m, screen -list mówi, że nie ma gniazd, screen -r nie ma sesji
darkfeline,
1
Jakoś twoje polecenie nie zostało znalezione lub nie działa poprawnie w automatycznie utworzonym środowisku ekranowym. Spróbuj po prostu screen yourcommandobejść się bez -di -mi zobacz, jak to będzie pierwsze.
Alan Curry
Masz rację. ekran kończy się po zakończeniu polecenia, wbrew moim oczekiwaniom. Ale twoja odpowiedź działa.
darkfeline
3
Możesz to zmienić, włączając zombieopcję na ekranie. Wprowadź zombie xyswoje ~/.screenrc. Powinno być także możliwe włączenie go tylko dla jednej sesji, b wstawiania zombie xyinnego pliku i używania, -c fileale z jakiegoś powodu to nie działa, kiedy próbuję. Lub po prostu użyjsh -c 'yourcommand;while :;do sleep 9999; done'
Alan Curry
@AlanCurry, Nie, to też nie działa dla mnie, nawet jeśli polecenie działa idealnie (i zajmuje kilka godzin), gdy jest uruchamiane ręcznie na ekranie.
Cerin
47

Aby uruchomić pojedyncze polecenie na ekranie i odłączyć, możesz spróbować:

screen -dm sleep 10

Aby uruchomić wiele poleceń, spróbuj:

screen -dm bash -c "sleep 10; myscript.sh"

Należy pamiętać, że po zakończeniu programu screen (domyślnie) zabija okno, które go zawierało.

Jeśli nie chcesz, aby sesja została zabita po zakończeniu skryptu, dodaj exec shna końcu, np .:

screen -dm bash -c 'sleep 5; exec sh'

Aby wyświetlić listę wszystkich sesji, spróbuj:

screen -list

Powiązane: Uruchom ekran Uniksa, polecenie Uruchom, Odłącz .

kenorb
źródło
2
To działało dla mnie na Ubuntu 16.04. Ponadto, aby wymienić sesji, dzięki czemu można powrócić do niego później, dodać -S sessionname: screen -dmS MyLongRunningScript bash -c "...".
Dan Dascalescu
16

Aby rozpocząć nową sesję w tle o nazwie „śpiący”

screen -S sleepy -dm sleep 60

Aby zabić „senną” sesję

screen -S sleepy -X quit      
Michał Zmuda
źródło
dlaczego to nie działa jak screen -S sleepy -dm "cd myfolder;sleep 60"?
Zestaw narzędzi
@Toolkit Problem polega na tym, że masz polecenie w cudzysłowie, dlatego zostało potraktowane jako jedno duże polecenie. Oczywiście nie możemy wyciągnąć go z cudzysłowu z powodu średnika. Aby rozwiązać ten problem, wykonaj polecenie w następujący sposób: screen -S sleepy -dm bash -c "cd myfolder; sleep 60"
Jason Thompson
3
screen -dmS screen_session_name bash -c 'echo "doing stuff"; exec bash'
tkjef
źródło
0

zdarzyło mi się, gdy nacisnąłem klawisz c (sig int), aby wyjść z mojego programu. wychodzi z samego końca. więc znalazłem to, aby złapać SIGINT. i zapobiegnij wyjściu z ostatniego uderzenia. (trzeba wpisać exit, aby wyjść)

screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"


example:

screen -dmS "status_updates" bash -c "trap 'echo gotsigint' INT; cd /opt/status_update ; forever index.js ;  bash"

Uważam, że przydatne jest używanie crona do uruchamiania programów nodejs podczas uruchamiania. i aby uruchomić ekran w czasie uruchamiania. w cronie są zdarzenia specjalne składnia @reboot zdarzenie

to edit cron, execute:
crontab -e

then type
@reboot screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"
Shimon Doodkin
źródło