wyślij polecenie do już uruchomionej sesji ekranu

11

Próbowałem wysyłać polecenia do uruchomionej sesji ekranu GNU (4.00.03) w opensolaris, ale nie mogę zmusić go do uruchomienia żadnych poleceń za pomocą dowolnej kombinacji screen -X

Ok, zaczynam sesję ekranową od screen -S test, a następnie próbuję screen -r -X "date"pokazać mi datę, kiedy ponownie się z nią połączę. Ale nie pojawił się ani komunikat o błędzie, ani wyjście na ekranie. Próbowałem z tak wieloma kombinacjami, że nawet nie pamiętam.

Wszelkie wskazówki, jak to osiągnąć?

Powodem, dla którego to robię, jest to, że mam program, który nie przychodzi jako demon, i chcę uruchomić go w sesji ekranowej, aby później zobaczyć, co się dzieje.

Der Hochstapler
źródło
1
wydaje się, że to „polecenie”, o którym mówią na stronach podręcznika, jest przeznaczone do polecenia ekranowego, podobnie jak ustawienia samej sesji ekranowej. Zamiast wysyłać polecenia do powłoki, która jest otwierana w sesji ekranowej. Więc ktoś ma pomysł, jak to zrobić za pomocą skryptu bash?
@Axon: Tak, -X wysyła polecenia ekranowe, a nie polecenia powłoki, ale screen ma polecenie „screen”, które może otwierać nowe okna ekranowe.

Odpowiedzi:

18

W rzeczywistości jest to dość proste. Możesz użyć następujących opcji:

screen -S sessionname -X stuff 'command'`echo -ne '\015'`

echo -ne '\015'emuluje naciśnięcie Enterklawisza.

UWAGA: te „rzeczy” to polecenie ekranowe. http://www.gnu.org/software/screen/manual/screen.html#Stuff

strażnik
źródło
Czy możesz podać, co oznaczają „rzeczy”? Czy to nazwa ... lub polecenie ... lub inne parametry?
Cerin,
Działa w rzeczywistości, ale nie powiedziałbym, że to po prostu i tak;) Jest to coś takiego jak przekazywanie naciśniętych zdarzeń i przekazywanie nowej linii na ekran. Czy nie ma zwykłego polecenia wykonania ekranu ...?
ducin
@Cecin: stuffto polecenie ekranowe, które „ wpycha ” ciąg do standardowego wejścia
konrad
Jest to bardzo dobre, ale z jakiegoś powodu nie działa z „screen -RdS sessionname -X stuff 'ls -l' echo -ne '\015'”, dlaczego?
e271p314
to nie działa, chyba że uruchomię polecenie dwa razy ... i na osobnych wierszach poleceń ... jeśli screen -d -m -S sessionname; screen -S sessionname -X [...]nic nie zrobię, to nigdy nie zadziała, nawet (screen -d -m -S sessionname&)&sleep 10;screen -S sessionname -X [...]nie zrobię nic oprócz stworzenia nowej sesji ekranowej, która nic nie robi. głosowanie w dół
użytkownik3338098,
5

Brzmi jak chcesz:

$ screen -S test -d -m -c / dev / null - sh -c 'data; exec $ SHELL '

-S test: nazwij tę sesję
-d -m: ekran startowy odłączony
-c / dev / null: ignore ~ ​​/ .screenrc (podaj inny plik lub upuść tę opcję,
  w razie potrzeby)
-: opcje końca ekranu
sh-c 'data; exec $ SHELL ': polecenie uruchomienia ekranu, zwróć uwagę, że jeśli to polecenie
  był po prostu „datą”, a następnie ekran natychmiast zniknął. jeśli nie chcesz wyjść
  ekran po wyjściu z polecenia, możesz użyć:
    $ screen -S test -d -m -c / dev / null - twoje polecenie tutaj

A może po prostu chcesz dtach .


źródło
Uruchomienie tego powoduje nic. Brak komunikatów o sukcesie lub błędach, ale screen -listpokazuje , że żadne sesje nie są otwarte.
Cerin
Ta odpowiedź zadziałała dla mnie. Kluczem było - aby zakończyć opcje ekranu.
Plazgoth,
1
screen -S <session_name> -X screen [-t <title>] <shell_command> [<args>]

Otwórz nowe okno (z tytułu własności ) w istniejącej sesji nazwie sesion_name i wykonać shell_command (z opcjonalnym argumentów args )

Jeremy Kao
źródło