2011-06-30 12 views
22

Jak mogę napisać ekran GNU, aby zacząć od uruchomionego w nim programu, aby nie opuszczał sesji po zakończeniu programu?Jak mogę napisać ekran GNU, aby zacząć od uruchomionego w nim programu, aby nie opuszczał sesji po zakończeniu programu?

Chcę uruchomić interaktywny program jako demon, jeśli ręcznie uruchomię ekran, a następnie uruchomę ten program, wszystko działa tak, jak chcę. Jeśli program wyjdzie lub ulegnie awarii, sesja ekranowa pozostanie i będę mógł go obejrzeć, aby zobaczyć, co się stało. Jeśli jednak uruchomię program za pomocą prostego uruchomienia ekranu, uruchomi się on na ekranie, ale kiedy program wyjdzie, sesja ekranu się skończy i wszelkie dane wyjściowe z programu zostaną utracone.

Tak screen –dmS serverName serverApplication nie działa w moim scenariuszu. Pomyślałem o zrobieniu skryptu, który uruchamia program, który chcę uruchomić & następnie śpi na zawsze, mógłbym wtedy uruchomić skrypt w tym samym czasie co ekran i powinien uzyskać efekt, na którym jestem, ale wydaje się raczej nieporządnym sposobem robienia rzeczy i jestem pewien, że musi być coś bardziej eleganckiego.

Przeczytałem sporo samouczków ekranowych i prześlizgnąłem się przez stronę podręcznika, ale nic nie wyskoczyło na mnie jak na właściwą drogę. Zrobiłem -X, ale to jest dla poleceń ekranowych, nie dla uruchamiania poleceń w trakcie sesji screen ... Wszelkie sugestie będą bardzo doceniane; Cieszę się nawet, że mogę użyć czegoś innego niż GNU Screen, jeśli jest lepsze narzędzie do wykorzystania w skryptach, ale proszę podać mi przykład, gdzie to możliwe.

(Side note: Dwie rzeczy będę uruchomione z tym są minecraft_server i mythtv_backend Mój plan był, aby uruchomić je z pracy Kron w bagażniku przez jakiegoś Ruby/skryptu bash).

Odpowiedz

26

pierwszy, „ll chcesz rozpocząć sesję screen demon po prostu działa domyślnej powłoki:

$ screen -dmS "serverName" 

Następnie wysłać polecenie do tego płaszcza użyciu ekranem stuff w połączeniu z -X:

$ screen -S "serverName" -p 0 -X stuff "serverApplication$(printf \\r)" 

Numer -p jest ważny dla informowania ekranu, w którym oknie w tej sesji wypełnia się polecenie. W tym przypadku jest to jedyne dostępne okno, 0, ale jeśli tego nie określisz, z jakiegoś dziwnego powodu twoje polecenie zniknie. $(printf \\r) wysyła skrót klawiszowy "Return". Zwykły \n może działać zamiast tego, ale I've read jest zależny od powłoki. Znak nowej linii nie działa w bash; Mogę za to ręczyć.

Oto kolejna fajna sztuczka. Jeśli chcesz, aby następnie dokonać innego okna ekranu w ciągu danej sesji, można:

$ screen -S "serverName" -X screen 

Teraz możesz wysyłać polecenia do tego jednego, używając tej samej składni jak wyżej, ale z -p 1. Dużo zabawy.

+0

Jeśli działa parametr -p, będzie świetnie! Wypróbuję to później. Znalazłem kilka szczegółów na stronie programistycznej https://savannah.gnu.org/bugs/index.php?10074, które pokazują, że jest to od dawna występujący błąd na ekranie, jest on poprawiony w nowej wersji, ale to nie jest gotowe jeszcze :-( – TafT

+3

Po prostu wypróbowałem to w prostym przypadku, a polecenie screen stuff nie jest wymagane, exec będzie działał poprawnie z parametrem -p 0 i oznacza, że ​​nie widzę $ (printf \\ r), aby uzyskać skrypt do wykonania: '$ screen -dmS" nazwa_serwera " $ screen -S" nazwa_serwera "-p 0 -X exec severApplication' – TafT

+1

Świetnie!Dobrze jest usłyszeć inną metodę. exec jest zdecydowanie łatwy do zapamiętania niż $ (printf \\ r)! :) – Eric