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

Выход из экранов с тем же именем по SSH

У меня есть сервер, с которого запущено несколько экранов. Это то, что видно, когда я использую screen -ls:

 There are screens on:
    12811.screen    (Detached)
    2061.screen (Detached)
    7055.screen (Detached)
    11746.screen    (Detached)
    11740.realscreen    (Detached)
    11740.screen    (Detached)
6 Sockets in /var/run/screen/S-root.

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

Есть ли файл bash, который я мог бы использовать, который бы перебирал все экраны и выходил из них? Или есть другой способ закрыть все экраны с тем же именем?

Что-то вроде этого поможет, если разобрать screen -ls output, сопоставляя только одноименные экраны и отправляя им kill:

SCREENSTOKILL="screen"
screen -ls | egrep "\.${SCREENSTOKILL}[[:space:]]+\(Detached\)" | cut -d. -f1 | xargs kill

Или вы можете захватить все идентификаторы родительских процессов экрана (дочерние процессы в моей версии экрана имеют полное имя заглавными буквами), исключить один процесс, который вы хотите игнорировать, а затем убить остальные:

pgrep -f screen | grep -v '11740' | xargs kill

Попробуй это:

pkill -f 'SCREEN.*\<screen\>'

Он ищет все сеансы экрана, в которых слово «экран» выделено отдельным словом в полной командной строке процесса. Он убьет такие процессы, как первый и третий, но не второй, как показано в этом примере выходных данных ps:

dennis   25514  0.0  0.1   4216  1364 ?        Ss   17:04   0:00 SCREEN -S screen
dennis   25609  0.0  0.1   4216  1364 ?        Ss   17:04   0:00 SCREEN -S realscreen
dennis   25702  0.0  0.1   4216  1360 ?        Ss   17:04   0:00 SCREEN -S screen

Если бы у вас был screen сеанс с именем "реальный экран" или "real.screen" также убьет их. Однако при необходимости вы можете использовать конкретное регулярное выражение.