Назад | Перейти на главную страницу

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

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

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

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

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

На странице руководства:

   -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

Если вы сделаете 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

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

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

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 используется, когда мы хотим выполнить команду на каждом из входов.

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

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

kill -9 ПРОЦЕССИД

очистить экран SESSIONID

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

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

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

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

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

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

Ctrl A + C

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

Ctrl + D

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