zabić ekran (ale nie wszystkie ekrany)

19

Mam wiele ekranów uruchomionych na serwerze Ubuntu, które są inicjowane jako:

screen -dmS screen1 cmd
screen -dmS screen2 cmd
etc...

I muszę zabić jeden ekran, ale nie wszystkie. Jakie jest prawidłowe polecenie zabicia pojedynczego ekranu z jego nazwą? Przeczytałem strony podręcznika, ale nie mogę znaleźć polecenia, którego szukam.

Chcę też napisać to polecenie w skrypcie bash, więc nie mogę po prostu screen -r screen1nacisnąć Ctrl+, Xjak zwykle.

BassKozz
źródło
Przepraszam, pomyślałem, że chodziło o Donkey Konga na sekundę
Chopper3
Kocham tę koszulkę ohgizmo.com/wp-content/uploads/2008/11/…
Chopper3
To miłe tee, większość ludzi nie będzie to ty, chyba że widziałem „The King of Kong”: imdb.com/title/tt0923752
BassKozz
Prawidłowym słowem dla obiektu wyrażenia jest „tobie”.
Wstrzymano do odwołania.
3
Powiedziałeś „weź to” tutaj i „dziękuję” poniżej. Powinno to być „weź to dla ciebie” i „dzięki [być dla ciebie”.
Wstrzymano do odwołania.

Odpowiedzi:

19

Ze strony podręcznika:

   -X   Send the specified command to a running screen  session.  You  can
        use  the  -d or -r option to tell screen to look only for attached
        or detached screen sessions. Note that this command  doesn't  work
        if the session is password protected.

Możesz to zrobić :

        screen -X -S <sessionid> kill
François Feugeas
źródło
DOSKONAŁY!!! Dzięki defraagh, musta tęsknił za tym mężczyzną.
BassKozz,
Dobrze wiedzieć :-)
ℝaphink
9

Jeśli to zrobisz screen -list, zauważysz, że każda nazwa ekranowa zaczyna się od cyfry, która jest PID ekranu:

 $ screen -list
There are screens on:
        12281.pts-1.jonah       (12/21/2009 07:53:19 PM)        (Attached)
        10455.pts-1.jonah       (12/19/2009 10:55:25 AM)        (Detached)
2 Sockets in /var/run/screen/S-raphink.

Stamtąd po prostu wyślij sygnał KILL do tego konkretnego PID:

$ kill 12281

i zabije określony ekran.

Inkaphink
źródło
to nie zadziała, ponieważ uruchamiam go ze skryptu bash i raczej nie muszę pobierać PID z listy-ekranów, która pasuje do prawidłowego ekranu ... powyższa odpowiedź defraagh działała jak urok. Dziękuję
BassKozz,
Ok, dobrze, że defraagh miał na to idealne rozwiązanie.
ℝaphink,
1

rozwiązanie defraagh nie działa dla mnie, jednak mogę zabić sesję ekranową, używając pomysłu Raphinka:

screen -list pobierz identyfikator procesu

zabij -9 PROCESSID

wyczyść ekran SESSIONID

garconcn
źródło
1

Jeśli masz kilka ekranów o tej samej nazwie, możesz je zabić jednocześnie:

screen -ls  | egrep "^\s*[0-9]+.ScreenName" | awk -F "." '{print $1}' | xargs kill
  • Polecenie screen -lsdrukuje ekrany z ich numerem procesu. Na przykład 4773.test to ekran z numerem procesu 4773 i testem nazwy . Przykładowe dane wyjściowe:

    6322.ss      (05/23/2018 10:39:08 AM)        (Detached)
    6305.sc  (05/23/2018 10:38:40 AM)        (Detached)
    6265.ScreenName       (05/23/2018 10:37:59 AM)        (Detached)
    6249.ScreenName  (05/23/2018 10:37:50 AM)        (Detached)
    6236.scc        (05/23/2018 10:37:42 AM)        (Detached)
  • egrepFiltry poleceń powyżej przykładowego tekstu wysyłanego za pomocą rurociągu | .

  • Polecenie awk -F "." '{print $1}'wypakowuje pierwszą kolumnę każdego wiersza. Separator między kolumnami jest definiowany jako kropka (.) Przez opcję -F
  • W końcu polecenie xargs killzabije cały proces, którego numery wysłane są przez potok |. xargsjest używany, gdy chcemy wykonać polecenie na każdym z wejść.
Mohsen Abasi
źródło
0

Otworzysz nowe okno za pomocą

Ctrl A + C

Zamykasz okno za pomocą

Ctrl + D

lub zakończ polecenie w oknie

Thomas Webber
źródło
0

Miałem do czynienia z tym w następujący sposób:

process=$(screen -ls | grep screen1)
kill $(echo $process | cut -f1 -d'.')
exit

Wyjaśnienie jest takie, że bierzesz wynik screen -lsi znajdujesz konkretny ekran, który Cię interesuje, używając grep, a następnie przypisujesz ten ciąg do zmiennej process.

Ponieważ wyjściem screen -lsjest zawsze PID, po którym następuje kropka, możesz następnie użyć cięcia, aby pozbyć się kropki i wszystkiego po niej. w powyższym przykładzie umieszczamy to w nawiasach i podajemy do polecenia kill, chociaż można to zrobić liniowo, co może obejmować zapis do pliku tymczasowego i odczytanie tego.

Musisz upewnić się, że twoja nazwa ekranowa jest unikalna, a grep zwraca TYLKO nazwę ekranu, który chcesz zabić.

unifex
źródło