如何使用 UID 杀死用户的所有进程

如何使用 UID 杀死用户的所有进程

我想通过 Linux 系统上的 shell 脚本或本机代码终止特定用户的所有正在运行的进程。

我是否必须读取 /proc 目录并查找这些内容?

有任何想法吗? Linux 中 UID 下的 pid 是否有动态映射?这不是在程序中吗?

如果没有,那么这个列表在哪里维护?我应该从中阅读吗?另外,系统中所有 UID 的静态列表在哪里,以便我可以验证该用户是否存在,然后继续终止在该用户下运行的所有进程?

答案1

使用pkill -U UIDpkill -u UID或 用户名代替 UID。有时skill -u USERNAME可能有效,另一个工具是killall -u USERNAME

技能是特定于 Linux 的,现在已经过时了,并且杀戮更可移植(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.

Skill 的手册页显示是否只允许使用用户名,而不是用户 ID: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)和全杀(psmisc) 工具都使用getpwnam库调用解析-u选项的参数,并且仅解析用户名。pkill(procps 和 procps-ng)同时使用 atol 和 getpwnam解析-u/-U参数并允许数字和文本用户说明符。

答案2

如果将 -1 作为进程 ID 参数传递给kill外壳命令或者killC函数,然后信号被发送到它可以到达的所有进程,这实际上意味着运行命令或系统调用的用户的所有进程kill

su -c 'kill -TERM -1' bob

在 C 语言中(省略错误检查):

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

答案3

如果 pkill 功能在您的 UNIX / Linux 发行版上不可用,您可以以 root 用户身份运行以下命令:

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

其中 username 是您要删除的进程的用户

答案4

这对我来说效果很好。您可以通过用户名找到所有进程的 pid,然后ps U <username>从那里开始。尝试这个:

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

相关内容