Utwórz ekran i uruchom polecenie bez dołączania

29

Pracuję nad automatyzacją procedury konserwacji, która obejmuje uruchamianie i zatrzymywanie skryptu uruchomionego w sesji ekranowej. Moje podejście polega na zabiciu sesji ekranowej, a następnie zrestartowaniu jej i uruchomieniu polecenia ze skryptu przy użyciu umiejętności zarówno utworzenia ekranu, jak i przekazania polecenia bez konieczności dołączania się do ekranu.

Mam jednak z tym trudności. Mogę poprawnie utworzyć ekran bez dołączania go screen -d -m -S screen_name. Jeśli jednak uruchomię polecenie na podstawie:

screen -S screen_name-X stuff "command 1"'echo -ne '\015''"command 2"'echo -ne '\015''

z echem -ne '\ 015' jest owinięte backsiksem zamiast pojedynczych cudzysłowów. Ma to na celu symulację naciśnięcia klawisza Enter przez użytkownika, ponieważ używane przeze mnie polecenia przenoszą się do katalogu i wykonują znajdujący się tam skrypt. To polecenie działa, ale tylko wtedy, gdy ekran został dołączony po utworzeniu. Kiedy próbuję zautomatyzować proces tworzenia ekranu i uruchamiania poleceń w nim, chciałbym uniknąć konieczności dołączania i odłączania w skrypcie. Spróbuję zasugerować utworzenie skryptu powłoki zawierającego polecenia, które muszę wykonać na ekranie i edytować zgodnie z moimi wynikami.

Czy istnieje sposób utworzenia ekranu i uruchomienia polecenia na ekranie albo w jednym poleceniu, albo bez konieczności dołączania do ekranu po utworzeniu, ale przed wykonaniem polecenia?

Z góry dziękuję.

** Aktualizacja - po wypróbowaniu sugestii umieszczenia poleceń, które muszę wykonać w skrypcie powłoki, udało mi się pomyślnie utworzyć ekran i wykonać polecenia z poziomu ekranu, ale otrzymuję takie zachowanie, że skrypt przestaje działać ekran również się zamyka. Nie powinno to stanowić problemu, ponieważ skrypt jest skryptem rejestrującym, który powinien zatrzymać się tylko za wiedzą administratora sys lub za pomocą skryptu, który próbuję opracować, jednak lepiej byłoby skonfigurować ekran w taki sposób, aby ekran nie zniknie, jeśli skrypt zostanie zatrzymany. Czy można osiągnąć takie zachowanie? **

ekspres do kawy
źródło
1
Natknąłem się na ten sam problem i znalazłem rozwiązanie na superuser.com dla każdego, kto natknie się na ten problem superuser.com/questions/342463/...
Dan Herbert
Aby utrzymać ekran otwarty, możesz użyć czegoś takiego: screen bash -c 'echo "test"; / bin / bash '
gwyn
1
W przypadku problemu z automatycznym zamykaniem możesz użyć specjalnej .screenrclinii zawierającej linię zombie kr, która utrzyma otwarte okno otwarte, i możesz nacisnąć, kaby zamknąć winodw lub rponownie uruchomić polecenie w oknie. Mam to dla mojego domyślnego .screenrc.
Martin C.

Odpowiedzi:

18

Myślę, że możesz napotkać kilka problemów.

Jeśli polecenie zakończy się przed ponownym dołączeniem, ekran zniknie. Możesz to zrobić za pomocą:

screen -d -m ls -l

Uruchomi ls -lpolecenie, ale screen -listnie wyświetli go po zakończeniu procesu ekranu.

Nie mam też pojęcia, co próbujesz zrobić z tymi \ 015 rzeczami. Być może zaktualizowanie pytania pomogłoby, ponieważ myślę, że próbujesz wykonać wiele poleceń w sesji ekranowej. Powinno to być tak proste, jak:

screen -d -m bash -c "command1 ; command2 ; command3"

Jeśli są one często używane, być może powinieneś utworzyć skrypt powłoki, który uruchamia tylko te polecenia, a następnie użyj prostszego:

screen -d -m /path/to/script.sh
Michael Graff
źródło
Czy istnieje sposób na uzyskanie podobnego zachowania bez natychmiastowego odłączania ekranu? Powiedz, że chcę rozpocząć sesję ssh, a następnie odłączyć zaraz po; screen -d -m sshodłączy się po wyświetleniu monitu o hasło przed rozpoczęciem sesji.
jasna gwiazda
To mi nie działa. Zastąpienie hte „commandN” kilkoma długo działającymi programami powoduje, że nic się nie pojawia screen -list. Nie oznacza to również ekranu, jak próbuje OP.
Cerin
Chciałem uruchomić program w języku Python przy użyciu tej metody. Próbowałem utworzyć skrypt sh, aby go uruchomić, ale nie widziałem ekranu na liście. Zamiast tego użyłem screen -d -m python EventGenerator.py, który działał świetnie
Dan Ciborowski - MSFT
1
To prawdopodobnie powinno być bash -c "commands"zamiastbash "commands"
marcovtwout
Masz rację, musi być -c.
Xdg,
9

Uruchom odłączony ekran

screen -dmS <screen name>

Wykonaj polecenie na wcześniej utworzonym odłączonym ekranie

screen -S <screen name> -X stuff '<CMD>\n'

Tak, musisz wpisać symbol enter, aby przesłać polecenie, w przeciwnym razie po prostu doda ciąg do ekranu.

http://osdir.com/ml/gnu.screen/2003-09/msg00029.html

Jogesh
źródło
1
co to są „rzeczy”?
Nadav B
stuffjest tak naprawdę poleceniem, które kopiuje i wkleja inne polecenie do sesji ekranowej: stuff [ciąg] Faszeruj ciąg znaków w buforze wejściowym bieżącego okna. To jest jak polecenie „wklej”, ale z dużo mniejszym obciążeniem. Bez parametru screen wyświetli monit o podanie ciągu do wypełnienia. Nie można wklejać dużych buforów za pomocą polecenia „stuff”. Jest to najbardziej przydatne do przypisywania klawiszy. Zobacz także „bindkey”. [cyt. z
theterminallife.com/sending-commands-into-a-screen-session/
2

Zetknąłem się z tym problemem wcześniej, był to błąd związany z implementacją cygwin.

Stworzyłem „.screenrc_detaching” posiadający tylko następujące polecenie

#detach
detach 

a następnie uruchom ekran za pomocą

screen -c ~/loginScripts/tempScreenrc/.screenrc_detaching

Następnie masz sesję ekranową, która jest już dołączona i odłączona i możesz pompować do niej polecenia.

Łatwy ! : P

PiersyP
źródło
2

To wykonało pracę dla mnie, bez -cnie działało

screen -d -m bash -c "command1; command2; command3"

Mazilu88
źródło
1

Skopiuj i wklej sposób przetestowania poprzednich odpowiedzi:

 # No sessions:
screen -ls

 # Returns immediately:
time screen -dmS screen_descritive_session_name  bash -c 'sleep 20; hostname >> /tmp/h'

 # New session present:
screen -ls

 # File with return of command was created :)
sleep 20; cat /tmp/h

Oczekiwany wynik powinien być podobny do:

No Sockets found in /var/run/screen/S-yourusernamehere.

(Oznacza to, że wcześniej nie utworzono żadnej sesji ekranowej)

real    0m0.002s
user    0m0.000s
sys     0m0.000s

(Jest to czas spędzony na tworzeniu ekranu i odłączaniu się od niego. Niemal natychmiastowy.)

There is a screen on:
    20318.screen_descritive_session_name    (20/08/2018 16:29:35)   (Detached)
1 Socket in /var/run/screen/S-yourusernamehere.

(To wyjście pokazuje dostępne sesje ekranowe. Utworzone przy ostatnim poleceniu.)

sleep 20; cat /tmp/h

( catPokazuje nazwę hosta wykonaną w gnu-screen)

Enrique S. Filiage
źródło
a jaki jest wynik takich testów?
Pierre.Vriens,
Masz rację, nie było żadnego przykładu. Dodam.
Enrique S. Filiage,
dużo lepiej! Merci! +1
Pierre.Vriens
0
screen -S test -d -m -- sh -c 'ls; exec $SHELL'
Nadav B.
źródło