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

use*_*152 79 linux c proc

我想从 Linux 系统上的 shell 脚本或本机代码中杀死特定用户的所有正在运行的进程。

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

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

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

osg*_*sgx 101

使用pkill -U UIDorpkill -u UID或 username 代替 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.
Run Code Online (Sandbox Code Playgroud)

技能手册页说是否只允许使用用户名,而不是用户 ID:http : //man7.org/linux/man-pages/man1/skill.1.html

技能,snice ......这些工具已经过时且不可移植。命令语法定义不明确。考虑使用killall、pkill

  -u, --user user
         The next expression is a username.
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

我认为,用于在 Linux/Solaris 样式 /proc (procfs) 中查找进程的任何实用程序都将使用完整的进程列表(执行一些 readdir of /proc)。我认为,他们将遍历/proc数字子文件夹并检查每个找到的进程是否匹配。

要获取用户列表,请使用getpwent(每次调用将获取一个用户)。

Skill (procps & procps-ng) 和killall (psmisc) 工具都使用getpwnam库调用来解析-u选项的参数,并且只会解析用户名。pkill(procps & procps-ng)使用 atol 和 getpwnam来解析-u/-U参数并允许数字和文本用户说明符。

  • `killall -u USERNAME` 很有魅力 (4认同)
  • pkill 并没有过时。它可能无法在 Linux 之外移植,但问题是专门针对 Linux 的。 (2认同)

Gil*_*il' 10

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

su -c 'kill -TERM -1' bob
Run Code Online (Sandbox Code Playgroud)

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

if (fork() == 0) {
    setuid(uid);
    signal(SIGTERM, SIG_DFL);
    kill(-1, SIGTERM);
}
Run Code Online (Sandbox Code Playgroud)


小智 7

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

ps -ef | grep username | grep -v grep | awk '{print $2}' | xargs kill
Run Code Online (Sandbox Code Playgroud)

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

  • 或者只是“pkill -U 用户名”。 (2认同)