Uruchom (GNU) ekran ze skryptu

11

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 startupi uruchomię screen -S startup -X exec tail -f /var/log/messagesz 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ń

promień
ź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 uruchomisz screen top, kiedy wyjdziesz top, screenrównież się zakończy
warren
Tak, teraz to dlatego próbowałem uruchomić screen jako deamon, a następnie użyj exec, a następnie użyj polecenia screen, aby otworzyć nowe okno (lauching powłoki). Próbowałem też tu prepend bash między exec a tailem lub między screenem i powiedzieć, ale żadne z nich nie działa
promień

Odpowiedzi:

14

screen -S test -X screen commandPolecenia 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 to screen -S script -X screen sh -c 'command1; command2;':).

Wywoływanie screen -S test -X screenbez 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. zombieAby to włączyć, użyj polecenia screen. Twoja sekwencja wygląda następująco:

screen -d -m -S script
screen -S script -X zombie qr
screen -S script -X screen tail -f /var/log/messages
screen -S script -X screen tail -f /var/log/xinetd.log

Aby ponownie dołączyć interaktywnie:

screen -S script -r

I na koniec możesz zamiast tego przepisać te polecenia -X jako skrypt screenrc.

Screenrc:

zombie qr
screen tail -f /var/log/messages
screen tail -f /var/log/xinetd.log

Scenariusz:

screen -d -m -S script -c screenrc
Tobu
źródło
Tak, wiem, że -X przyjmuje polecenie ekranowe, co mam na myśli, kiedy powiedziałem „Łańcuchowe polecenie ekranowe (to po -X)” (Ok, wcale nie jest jasne), ale jest polecenie screen exec, spójrz na człowieka stronę, ale jak powiedziałeś, nie ma sposobu, aby działała tak, jak powinna w trybie nieinteraktywnym. W każdym razie dzięki rozwiązaniu AlexD i poleceniu zombie dodaj, że mam to, czego chcę! Dziękuję
promień
@Tobu: +200 za wzmiankę o zombie! Ostatecznie nigdy nie zauważyłbym tego w tej strasznej instrukcji!
winorośle
6

Jeśli chcesz uzyskać taki sam efekt jak Ctrl-A cwtedy, powinieneś użyć screenzamiast exec:

screen -S test -X screen tail -f / var / log / messages
ekran -S test -X ekran
screen -S test -X screen tail -f /var/log/xinetd.log

Możesz także przenieść powyższe polecenia do $HOME/.screenrc-younameitpliku (bez screen -S test -Xprefiksu) i uruchomić je, screen -c $HOME/.screenrc-younameitgdy chcesz utworzyć określoną sesję ekranową.

AlexD
źródło
Ctrl-A c znajduje się w mojej 3. linii, chyba nie działa exec, ponieważ exec uruchom polecenie w bieżących oknach, które mogą nie zostać zdefiniowane, gdy ekran jest odłączony. Twój ekran łączenia łańcuchów i polecenie są fajne, powinienem był spróbować! Dodam odpowiedź do siebie, ponieważ twoja odpowiedź nie tworzy sesji i ma niepotrzebną linię (druga, pomijanie 1 okna)
promień
W rzeczywistości nie działa zgodnie z oczekiwaniami, okna zamykają się, gdy tylko program się zatrzyma. jeśli wykonasz screen -S test -X screen ls, okno zostanie zamknięte i nigdy nie zobaczysz wyniku
promień
1

używa opcji byobu ?

Sirex
źródło
Właśnie próbowałem, nie wiem, jak to może pomóc, ale jeśli masz działające rozwiązanie z byobu, może być w porządku, wolę rozwiązanie tylko z ekranem, ale użycie dodatku jest lepsze niż brak rozwiązania!
promień
1

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:


#1/bin/sh 
screen -d -m -S CS140 
screen -S CS140 -X screen -t thread.c 
screen -p 1 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/thread.c\015"'
screen -S CS140 -X screen -t thread.h 
screen -p 2 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/thread.h\015"'
screen -S CS140 -X screen -t palloc.c 
screen -p 3 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/palloc.c\015"'
screen -S CS140 -X screen -t intr-stubs.h 
screen -p 4 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/intr-stubs.h\015"'
screen -S CS140 -X screen -t pagedir.c 
screen -p 5 -S CS140 -X eval 'stuff "vim cs140-ps2/src/userprog/pagedir.c\015"'
screen -r -d CS140 

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!

DevonH
źródło