У меня есть сервер, с которого запущено несколько экранов. Это то, что видно, когда я использую 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" также убьет их. Однако при необходимости вы можете использовать конкретное регулярное выражение.