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

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

Должен ли я читать каталог / proc и искать их?

Есть идеи? Есть ли динамическое сопоставление pid под UID в Linux? Разве это не в процессе?

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

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

Умение было специфичным для 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 (он получит одного пользователя за звонок).

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

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

 su -c 'kill -TERM -1' bob 

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

 if (fork() == 0) { setuid(uid); signal(SIGTERM, SIG_DFL); kill(-1, SIGTERM); } 

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

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

где имя пользователя – это пользователь, для которого вы хотите удалить

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

 ps U <username> | cut -d " " -f 1 | xargs kill 
 pgrep -U username|xargs kill -9