Chciałbym uruchomić aplikację w sesji ekranowej, ale ze skryptu.
Bez skryptu po prostu uruchomiłem ekran, a następnie otworzyłem N okien za pomocą crtl-ac i uruchomiłem programy w każdym oknie.
Próbowałem następujące
screen -d -m -S test
screen -S test -X exec tail -f /var/log/messages
screen -S test -X screen
screen -S test -X exec tail -f /var/log/xinetd.log
Ale kiedy dołączam, ogon sesji nie działa. Jeśli dołączę sesję zaraz po tym screen -d -m -S startup
i uruchomię screen -S startup -X exec tail -f /var/log/messages
z innego terminala, to zadziała.
Przegapiłem coś ?
Edytuj po odpowiedzi AlexD:
Połowa działającego rozwiązania to
screen -d -m -S test tail -f /var/log/messages
screen -S test -X screen tail -f /var/log/xinetd.log
Łańcuchowe polecenie ekranowe (następne po -X) z poleceniem działa, gdy exec nie jest prawdopodobne, ponieważ exec oczekuje, że zostanie zdefiniowane bieżące okno, podczas gdy okno nie będzie obecne po odłączeniu ekranu. Dzięki AlexD za te wskazówki.
Ale jest dziwny efekt uboczny: kiedy program się zatrzyma (jeśli załączysz sesję ekranową i crtl-c ogonem lub zabijesz ogon) okno ekranu się zamknie.
Więc zachowanie nie jest takie samo jak Crtl-A c i uruchomienie polecenia
Kolejnym efektem ubocznym jest to, że nie można połączyć 2 poleceń
źródło
screen
zawsze kończy się, gdy kończy się polecenie, z którym zostało uruchomione - jest to normalna funkcja narzędzia :) .. więc jeśli uruchomiszscreen top
, kiedy wyjdziesztop
,screen
również się zakończyOdpowiedzi:
screen -S test -X screen command
Polecenia jest to, co trzeba dodać do okna sesji demona, ale nie z powodów dajesz. Działa, ponieważ -X przyjmuje polecenie screen, a nie polecenie shell, a polecenie screen, aby utworzyć okno, jest myląco nazywane screen. Brak polecenia exec screen. Nie ma również łańcuchów, chyba że zbudujesz komendę za pomocą skryptów powłoki (jak toscreen -S script -X screen sh -c 'command1; command2;'
:).Wywoływanie
screen -S test -X screen
bez polecenia jest bezużyteczne, ponieważ domyślnym poleceniem jest powłoka, a gdy już stworzysz powłokę, nie będziesz mieć nieinteraktywnego (i nie przebiegłego) sposobu uruchamiania poleceń wewnątrz tej powłoki. Lepiej jest uruchomić polecenie samodzielnie, bez interaktywnej powłoki. Efektem ubocznym jest to, że po wyjściu polecenia okno ekranowe nie ma już dziecka i zostanie zamknięte.Teraz możesz poprosić ekran, aby okno nadal pozostawało otwarte po zakończeniu polecenia.
zombie
Aby to włączyć, użyj polecenia screen. Twoja sekwencja wygląda następująco:Aby ponownie dołączyć interaktywnie:
I na koniec możesz zamiast tego przepisać te polecenia -X jako skrypt screenrc.
Screenrc:
Scenariusz:
źródło
Jeśli chcesz uzyskać taki sam efekt jak
Ctrl-A c
wtedy, powinieneś użyćscreen
zamiastexec
:Możesz także przenieść powyższe polecenia do
$HOME/.screenrc-younameit
pliku (bezscreen -S test -X
prefiksu) i uruchomić je,screen -c $HOME/.screenrc-younameit
gdy chcesz utworzyć określoną sesję ekranową.źródło
używa opcji byobu ?
źródło
Robiłem to samo dziś wieczorem, chciałem otworzyć ekran z kilkoma wstępnie otwartymi plikami. Zajęło mi to trochę czasu, aby to wszystko zrozumieć, ale w końcu wpadłem na następujące, które wydają się działać całkiem nieźle:
Spowoduje to utworzenie sześciu różnych ekranów, przy czym ekrany 1-5 otworzą różne pliki. Nie znam wszystkich szczegółów, ale „rzeczy” zasadniczo mówią ekranowi, że poniższy cytowany tekst nie jest poleceniem ekranowym. „Ewaluacja” usuwa następnie wszystko zawarte w cytatach. Bez tego po
screen -p 4 -S CS140 -X stuff "vim cs140-ps2/src/threads/intr-stubs.h\015"
prostu potokuje cytowany tekst bez wykonywania go. Eval odczyta „\ 015” jako nowy wiersz, a tym samym wykona poprzedni tekst.Jeśli chodzi o inne szczegóły,
screen -p 1 -S CS140 -X CMD
każe powłoce wysłać „CMD” do pierwszego okna sesji ekranowej o nazwie „CS140”.Mam nadzieję, że to pomaga!
źródło