Я хочу убить все запущенные процессы конкретного пользователя из сценария оболочки или из собственного кода в системе Linux.
Нужно ли читать каталог / proc и искать их?
Любые идеи? Есть ли в Linux динамическое отображение pids под UID? Разве это не в процедуре?
Если нет, то где хранится этот список? Должен ли я читать с него? Кроме того, где находится статический список всех UID в системе, чтобы я мог проверить, существует ли этот пользователь, а затем приступить к уничтожению всех процессов, работающих под ним?
setuid()
выбирает выполняемый процесс .Ответы:
Используйте
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.
Справочная страница навыка говорит, что разрешено использовать только имя пользователя, а не идентификатор пользователя: http://man7.org/linux/man-pages/man1/skill.1.html
killall не помечен как устаревший в Linux, но он также не будет работать с числовым UID; только имя пользователя: http://man7.org/linux/man-pages/man1/killall.1.html
Я думаю, что любая утилита, используемая для поиска процессов в стиле Linux / Solaris / proc (procfs), будет использовать полный список процессов (делает некоторые readdir из
/proc
). Я думаю, они будут перебирать/proc
цифровые подпапки и проверять каждый найденный процесс на соответствие.Чтобы получить список пользователей, используйте
getpwent
(он получит одного пользователя за звонок).Инструменты skill (procps & procps-ng) и killall (psmisc) используют
getpwnam
библиотечный вызов для разбора аргумента-u
опции, и только имя пользователя будет проанализировано.pkill
(procps & procps-ng) использует atol и getpwnam для разбора-u
/-U
аргумента и допускает как числовой, так и текстовый пользовательский спецификатор.источник
killall -u USERNAME
работал как шармЕсли вы передаете -1 в качестве аргумента идентификатора процесса либо в
kill
команду оболочки, либо вkill
функцию C , то сигнал отправляется всем процессам, которые он может достичь, что на практике означает все процессы пользователя, выполняющегоkill
команду или системный вызов.В C (проверка ошибок опущена):
источник
Если функция pkill недоступна в вашем дистрибутиве UNIX / Linux, вы можете запустить следующую команду как пользователь root:
где username - это пользователь, процессы которого вы хотите удалить
источник
pkill -U username
.источник
Это хорошо сработало для меня. Вы можете найти все pid процессов по имени пользователя, выполнив
ps U <username>
и перейдя оттуда. Попробуй это:источник