我想从Linux系统上的Shell脚本或本机代码中杀死特定用户的所有正在运行的进程。
我是否必须阅读/ proc目录并查找这些目录?
有任何想法吗?Linux中的UID下是否有pid的动态映射?这不是proc中的吗?
如果没有,那么此列表在哪里维护?我应该阅读吗?另外,系统中所有UID的静态列表在哪里,以便我可以验证此用户的存在,然后继续杀死在该用户下运行的所有进程?
setuid()
选择的任何内容。
我想从Linux系统上的Shell脚本或本机代码中杀死特定用户的所有正在运行的进程。
我是否必须阅读/ proc目录并查找这些目录?
有任何想法吗?Linux中的UID下是否有pid的动态映射?这不是proc中的吗?
如果没有,那么此列表在哪里维护?我应该阅读吗?另外,系统中所有UID的静态列表在哪里,以便我可以验证此用户的存在,然后继续杀死在该用户下运行的所有进程?
setuid()
选择的任何内容。
Answers:
使用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.
技术手册页上说仅允许使用用户名,而不允许用户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)查找进程的任何实用程序都将使用进程的完整列表(对进行一些readdir /proc
)。我认为,他们将遍历/proc
数字子文件夹并检查找到的每个进程是否匹配。
要获取用户列表,请使用getpwent
(每次通话将获得一个用户)。
Skill(procps和procps-ng)和killall(psmisc)工具都使用getpwnam
库调用来解析-u
option的参数,并且只会解析用户名。pkill
(procps&procps-ng)同时使用atol和getpwnam解析-u
/ -U
参数,并允许数字和文本用户说明符。
killall -u USERNAME
像魅力一样工作
如果将-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是要删除的进程的用户
pkill -U username
。