我想通过 Linux 系统上的 shell 脚本或本机代码终止特定用户的所有正在运行的进程。
我是否必须读取 /proc 目录并查找这些内容?
有任何想法吗? Linux 中 UID 下的 pid 是否有动态映射?这不是在程序中吗?
如果没有,那么这个列表在哪里维护?我应该从中阅读吗?另外,系统中所有 UID 的静态列表在哪里,以便我可以验证该用户是否存在,然后继续终止在该用户下运行的所有进程?
答案1
使用pkill -U UID
或pkill -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
答案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