У меня есть несколько экранов, запущенных на сервере 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}'
извлекает первый столбец каждой строки. Разделитель между столбцами определяется как точка (.) по выбору -Fxargs 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
или выйти из команды в окне