不久前我们发现pkill
我们打算开始在 setuid(代表 root)脚本中使用它来全局清理进程。这可以为我们节省大量愚蠢的维护工作,其中一些客户端仅由于不重要的权限限制而无法使用其脚本删除一般资源。
然而,经过一番挣扎,我们只想到了pkill -v -u root <name>
(到目前为止,我们打算使其简单,并防止演变成带有 、 等的长而丑陋的脚本sed
)awk
。grep
当然,它不起作用——它只是杀死了除与给定名称匹配的进程之外的所有进程。
是否有该命令的简短修改版本pkill
可以为我们提供所需的结果?
PS:我想避免任何关于向用户授予某种根权力的道德问题的讨论。
运行的操作系统是Solaris 10(如果有的话)。
答案1
这将生成具有给定名称的进程列表,以及以 root 身份运行的具有给定名称的进程列表,然后运行comm
以查找第一个列表中不在第二个列表中的进程,然后杀死它们。
#!/bin/ksh
if test $# != 1
then
echo usage: "$0" processname
exit 1
fi
pname="$1"
kill $(comm -23 <(pgrep "$pname"|sort -n) <(pgrep -u root "$pname"|sort -n))
答案2
我正在使用 SUSE ,但假设它在 Solaris 上的工作原理类似。
杀死用户的进程
为了通过用户 ID 杀死进程,您可以执行以下操作
#pkill -U <username>
检查用户的进程
如果您只想在终止特定用户的进程之前检查其正在运行哪些进程,您可以使用:
pgrep -U <username
杀死多个用户的进程
#pkill -U <user1>,<user2>,<user3>
等等。
杀死除 root 之外的所有用户
我知道您正在避免使用 sed 、 awk 、 grep 。但编写脚本比键入每个用户名更容易。这是一个示例。请在生产环境中执行之前检查 sanbox。
ps -aef |grep -v UID |grep -v root |awk '{print $1}'
|sort -u |while read name
do
echo "Killing process for user $name"
pkill -U $name
done