убить экран (но не все экраны)

19

У меня есть несколько экранов, запущенных на сервере Ubuntu, которые запускаются как:

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

И мне нужно убить один экран, но не все из них. Какова правильная команда, чтобы убить один конкретный экран с его именем? Я прочитал справочные страницы, но не могу найти нужную команду.

Также я хочу написать эту команду в сценарии bash, поэтому я не могу просто screen -r screen1нажать Ctrl+, Xкак обычно.

BassKozz
источник
Извините, на секунду подумал, что это про Донки Конга
Chopper3
Я люблю эту футболку ohgizmo.com/wp-content/uploads/2008/11/…
Chopper3
Это хорошая футболка, большинство людей не получат ее, если не увидят «Короля Конга»: imdb.com/title/tt0923752
BassKozz
Правильное слово для объекта фразы - "ты".
Приостановлено до дальнейшего уведомления.
3
Вы сказали «получи это» здесь и «спасибо» ниже. Это должно быть "получи [тебе]" и "спасибо тебе".
Приостановлено до дальнейшего уведомления.

Ответы:

19

Со страницы руководства:

   -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.

Ты можешь сделать :

        screen -X -S <sessionid> kill
Франсуа Феже
источник
ИДЕАЛЬНО!!! Спасибо defraagh, Муста пропустил это в человеке.
BassKozz
Полезно знать :-)
ℝaphink
9

Если вы сделаете a screen -list, вы заметите, что каждое имя экрана начинается с цифры, которая является PID экрана:

 $ 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.

Оттуда просто отправьте сигнал KILL на этот конкретный PID:

$ kill 12281

и это убьет конкретный экран.

ℝaphink
источник
это не сработает, потому что я запускаю его из скрипта bash, и мне, скорее, не нужно извлекать PID из списка экрана, который соответствует правильному экрану ... Ответ defraagh, приведенный выше, работал как чудо. Спасибо тебе.
BassKozz
Хорошо, хорошо, что у defraagh было идеальное решение для этого.
ℝaphink
1

Решение defraagh не работает для меня, однако я могу убить сеанс экрана, используя идею Raphink:

Экран-список получить идентификатор процесса

убить -9 ПРОЦЕССИД

экран - протрите SESSIONID

garconcn
источник
1

Если у вас есть несколько экранов с одинаковым именем, вы можете убить их сразу:

screen -ls  | egrep "^\s*[0-9]+.ScreenName" | awk -F "." '{print $1}' | xargs kill
  • Команда screen -lsпечатает экраны с их номером процесса. Например, 4773.test - это экран с номером процесса 4773 и именем теста . Образец вывода:

    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)
  • egrepФильтры команд над примером текста, отправляемого по конвейерной линии | ,

  • Команда awk -F "." '{print $1}'извлекает первый столбец каждой строки. Разделитель между столбцами определяется как точка (.) С помощью опции -F
  • Наконец, команда xargs killуничтожит все процессы, номера которых отправлены через канал |. xargsиспользуется, когда мы хотим выполнить команду на каждом из входов.
Мохсен Абаси
источник
0

Вы открываете новое окно с

Ctrl A + C

Вы закрываете окно с

Ctrl + D

или выйти из команды в окне

Томас Уэббер
источник
0

Я имел дело с этим следующим образом:

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

Объяснение состоит в том, что вы берете выходные данные screen -lsи находите конкретный интересующий вас экран, используя grep, а затем присваиваете эту строку переменной process.

Поскольку выводом screen -lsвсегда является PID, за которым следует точка, вы можете использовать команду cut, чтобы избавиться от точки и всего после нее. в приведенном выше примере мы помещаем это в круглые скобки и передаем его команде kill, хотя вы можете сделать это линейно, что может включать запись во временный файл и чтение из него.

Вы должны убедиться, что ваше экранное имя уникально и что grep возвращает ТОЛЬКО имя экрана, который вы хотите убить.

Unifex
источник