5

Я выполнял некоторые процессы в сеансе экрана на удаленном сервере. Когда я попытался убить все эти процессы:

pkill -U tim

все мои процессы убиты, включая те, которые я не хочу убивать (например, экран и соединение ssh).

Есть ли способ убить все мои процессы, кроме экрана и соединения ssh?

5 ответов5

11

Вроде хакерский

ps -U tim | egrep -v "ssh|screen" | cut -b11-15 | xargs -t kill

это убьет все, кроме ssh или экранных процессов. Вот объясненные команды:

  • ps -U tim - будет, очевидно, перечислять каждый процесс от пользователя tim
  • egrep -v "ssh|screen" - удалит строки с процессами ssh или screen
  • cut -b11-15 - обрежет данные в столбцах 11-15 (обычно там находится PID
  • xargs -t kill - передаст все идентификаторы процесса команде kill

Вы также можете использовать awk, если вы более привыкли к этому.

ps -U tim | egrep -v "ssh|screen" | awk '{print $2}' | xargs -t kill
1

Ничего не встроено в то, что я знаю. Вы можете создать скрипт, подобный этому:

#!/bin/bash
ps ux | sed -e '/bash/d' -e '/screen/d' | awk '{print $2}' | while read process
do 
  kill $process
done

Если бы вы хотели избежать каких-либо других процессов, вам просто нужно добавить больше

-e '/processname/d'

входы в раздел sed. Вероятно, есть более чистый способ справиться с этим, но это сработает.

1

Если вы много убиваете все свои проки, вы можете захотеть выяснить, зачем вам это нужно ... но эй, это все о том, чтобы делать что-то, а не о том, чтобы не делать что-то.

Одним из простых решений было бы использовать два идентификатора пользователя ... один для экрана и вашего SSH-соединения, а другой для всех процессов, которые вы в какой-то момент захотите завершить.

Это за пределами "хакерского" и просто "хакерского", но у него есть дополнительное преимущество в том, что любые ДРУГИЕ программы, которые вы запускаете как пользователь "подключения", не будут убиты, когда вы убьете другие процессы. Это может включать в себя "хвосты" журналов ошибок и тому подобные вещи, которые вы, возможно, ХОТИТЕ оставить.

Надеюсь это поможет!

1

Пытаться:

ps aux | grep ^$LOGNAME | egrep -v 'ps aux|-bash|sshd' | awk '{ print $2 }' | xargs kill -9; ps aux | grep $LOGNAME
0

Я использовал подход @RoyRico - не могу комментировать этот пост из-за отсутствия репутации - и приспособил его к своей системе. Из-за какой-то другой конфигурации, которая не работала в продаже.

ps -U myUserName | egrep -v "ssh|screen|grep|bash|systemd|(sd-pam)|ps" | awk '{print $1}' | tail -n +2 | xargs -t kill

Ну, я исключил больше процессов, которые я не хотел убивать. Во-вторых, идентификаторы PID появились в первом столбце, поэтому прежняя команда "cut" была совершенно неверно расположена (как хакерское решение, совершенно нормальное и приемлемое;)). В-третьих, во время grep'ing у меня был "PID" в качестве заголовка, который я исключил, используя tail.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .