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? **
źródło
.screenrc
linii zawierającej linięzombie kr
, która utrzyma otwarte okno otwarte, i możesz nacisnąć,k
aby zamknąć winodw lubr
ponownie uruchomić polecenie w oknie. Mam to dla mojego domyślnego .screenrc.Odpowiedzi:
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ą:
Uruchomi
ls -l
polecenie, alescreen -list
nie 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:
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:
źródło
screen -d -m ssh
odłączy się po wyświetleniu monitu o hasło przed rozpoczęciem sesji.screen -list
. Nie oznacza to również ekranu, jak próbuje OP.screen -d -m python EventGenerator.py
, który działał świetniebash -c "commands"
zamiastbash "commands"
Uruchom odłączony ekran
Wykonaj polecenie na wcześniej utworzonym odłączonym ekranie
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
źródło
stuff
jest 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. zZetknął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
a następnie uruchom ekran za pomocą
Następnie masz sesję ekranową, która jest już dołączona i odłączona i możesz pompować do niej polecenia.
Łatwy ! : P
źródło
To wykonało pracę dla mnie, bez
-c
nie działałoscreen -d -m bash -c "command1; command2; command3"
źródło
Skopiuj i wklej sposób przetestowania poprzednich odpowiedzi:
Oczekiwany wynik powinien być podobny do:
(Oznacza to, że wcześniej nie utworzono żadnej sesji ekranowej)
(Jest to czas spędzony na tworzeniu ekranu i odłączaniu się od niego. Niemal natychmiastowy.)
(To wyjście pokazuje dostępne sesje ekranowe. Utworzone przy ostatnim poleceniu.)
(
cat
Pokazuje nazwę hosta wykonaną w gnu-screen)źródło
źródło