Как убить все процессы пользователя, используя их UID

42

Я хочу убить все запущенные процессы конкретного пользователя из сценария оболочки или из собственного кода в системе Linux.

Нужно ли читать каталог / proc и искать их?

Любые идеи? Есть ли в Linux динамическое отображение pids под UID? Разве это не в процедуре?

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

user489152
источник
6
Вам нужен инструмент для этого (pkill, slay, другие существуют), или вы хотите написать его самостоятельно? Если первый, сайт обмена стека суперпользователя, вероятно, лучше. Если последнее, сканирование / proc и создание заметок для всех процессов конкретным пользователем - это путь. Исходный код для утилиты pkill, например, покажет, как это сделать.
Не могли бы вы уточнить, о чем этот вопрос, в свете комментария @ LarsWirzenius? Благодарность!
Калеб
@Caleb: я хотел убить процессы, читая / proc, так как я не знал ни одного инструмента, делающего это. Также теперь я обнаружил, что кроме «kill», «pkill», «skill» и т. Д. Не доступны в моей системе. В этом случае, я думаю, мне нужно взглянуть на альтернативные сценарии оболочки, чтобы прочитать / proc и найти способ получить процессы под одним пользователем. Любые идеи?
user489152
1
Что касается «статического списка всех UID… чтобы я мог проверить это, этот пользователь существует»: нет такой вещи, как проверка идентификатора пользователя. Имена пользователей поступают из базы данных, но идентификаторы пользователей - это то, что setuid()выбирает выполняемый процесс .
Жиль "ТАК - перестань быть злым"

Ответы:

54

Используйте pkill -U UIDили pkill -u UIDили имя пользователя вместо UID. Иногда skill -u USERNAMEможет работать, другой инструмент killall -u USERNAME.

Skill был специфичен для Linux и теперь устарел, а pkill более переносим (Linux, Solaris, BSD).

pkill позволяет использовать как цифровые, так и символические идентификаторы UID, эффективные и реальные http://man7.org/linux/man-pages/man1/pkill.1.html.

pkill - ... сигнальные процессы, основанные на имени и других атрибутах

    -u, --euid euid,...
         Only match processes whose effective user ID is listed.
         Either the numerical or symbolical value may be used.
    -U, --uid uid,...
         Only match processes whose real user ID is listed.  Either the
         numerical or symbolical value may be used.

Справочная страница навыка говорит, что разрешено использовать только имя пользователя, а не идентификатор пользователя: http://man7.org/linux/man-pages/man1/skill.1.html

навык, кусочек ... Эти инструменты устарели и непереносимы. Синтаксис команды плохо определен. Подумайте об использовании killall, pkill

  -u, --user user
         The next expression is a username.

killall не помечен как устаревший в Linux, но он также не будет работать с числовым UID; только имя пользователя: http://man7.org/linux/man-pages/man1/killall.1.html

killall - убивать процессы по имени

   -u, --user
         Kill only processes the specified user owns.  Command names
         are optional.

Я думаю, что любая утилита, используемая для поиска процессов в стиле Linux / Solaris / proc (procfs), будет использовать полный список процессов (делает некоторые readdir из /proc). Я думаю, они будут перебирать /procцифровые подпапки и проверять каждый найденный процесс на соответствие.

Чтобы получить список пользователей, используйте getpwent(он получит одного пользователя за звонок).

Инструменты skill (procps & procps-ng) и killall (psmisc) используют getpwnamбиблиотечный вызов для разбора аргумента -uопции, и только имя пользователя будет проанализировано. pkill(procps & procps-ng) использует atol и getpwnam для разбора -u/ -Uаргумента и допускает как числовой, так и текстовый пользовательский спецификатор.

osgx
источник
1
Пкилл не устарел. Это может быть непереносимо за пределами Linux, но вопрос был конкретно о Linux.
1
чтобы получить список пользователей, используйте один вкладыш: getent passwd | awk -F: '{print $ 1}'
Петеш
что я могу дать команду типа: "kill -ju UID" из системного вызова C ()?
1
это встроенный Linux? у тебя нет навыков, pkill и killall? Даже встроенная оболочка busybox имеет pkill и killall.
osgx
2
killall -u USERNAMEработал как шарм
michalzuber
8

Если вы передаете -1 в качестве аргумента идентификатора процесса либо в killкоманду оболочки, либо в killфункцию C , то сигнал отправляется всем процессам, которые он может достичь, что на практике означает все процессы пользователя, выполняющего killкоманду или системный вызов.

su -c 'kill -TERM -1' bob

В C (проверка ошибок опущена):

if (fork() == 0) {
    setuid(uid);
    signal(SIGTERM, SIG_DFL);
    kill(-1, SIGTERM);
}
Жиль "ТАК - перестань быть злым"
источник
5

Если функция pkill недоступна в вашем дистрибутиве UNIX / Linux, вы можете запустить следующую команду как пользователь root:

ps -ef | grep username | grep -v grep | awk '{print $2}' | xargs kill

где username - это пользователь, процессы которого вы хотите удалить

Сообщество
источник
или просто pkill -U username.
osgx
0

Это хорошо сработало для меня. Вы можете найти все pid процессов по имени пользователя, выполнив ps U <username>и перейдя оттуда. Попробуй это:

ps U <username> | cut -d " " -f 1 | xargs kill
jasonrhaas
источник