it-swarm-ru.tech

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

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

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

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

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

45
user489152

Используйте 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 аргумент и разрешить как числовой, так и текстовый пользовательский спецификатор.

60
osgx

Если вы передаете -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);
}
8

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

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

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

5
David
pgrep -U username|xargs kill -9
1
Alexander

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

ps U <username> | cut -d " " -f 1 | xargs kill
0
jasonrhaas