it-swarm.cn

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

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

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

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

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

45
user489152

使用pkill -U UIDpkill -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.

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

技能,技巧……这些工具已过时且无法移植。命令语法定义不正确。考虑使用killall,pkill

  -u, --user user
         The next expression is a username.

在Linux中,killall并未标记为过时,但也不适用于数字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)查找进程的任何实用程序都将使用进程的完整列表(执行/proc的readdir)。我认为,他们将遍历/proc数字子文件夹并检查找到的每个进程是否匹配。

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

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

60
osgx

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

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

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

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

这对我来说很好。您可以通过执行ps U <username>并按用户名找到进程的所有pid。尝试这个:

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