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


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

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

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

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


18
2017-12-21 18:45


Источник


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


Ответы:


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

   -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

19
2017-12-21 18:56



ИДЕАЛЬНО!!! Спасибо defraagh, musta пропустил это в человеке. - BassKozz
Хорошо знать :-) - ℝaphink


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

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


9
2017-12-21 18:54



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


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

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

kill -9 PROCESSID

screen -wipe SESSIONID


1
2017-09-29 19:26





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

Ctrl A + C

Вы закрываете окно с помощью

Ctrl + D

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


0
2018-05-23 15:09





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

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

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

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

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


0
2018-02-25 01:39





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

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

0
2018-05-23 11:11