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


41

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

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

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

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


6
您是否想要一种工具来执行此操作(是否存在技能,杀戮或其他),还是要自己编写?如果是前者,超级用户堆栈交换站点可能更好。如果是后者,则必须扫描/ proc并为特定用户记录所有进程的注释。例如,pkill实用程序的源代码将显示如何执行此操作。

您能否根据@LarsWirzenius的评论澄清这个问题的含义?谢谢!
Caleb

@Caleb:我想通过读取/ proc杀死进程,因为我不知道有什么工具可以这样做。现在我也发现除了“ kill”,“ pkill”,“ skill”等以外,我的系统上不可用。在那种情况下,我想我必须看一下shell脚本替代方案来阅读/ proc并找出一种在一个用户下获取进程的方法。有任何想法吗?
user489152 2011年

1
关于“所有UID的静态列表...,因此我可以验证此用户的存在”:没有验证用户ID之类的事情。用户名来自数据库,但是用户ID是运行的进程setuid()选择的任何内容。
吉尔(Gilles)“所以,别再邪恶了”,

Answers:


52

使用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)查找进程的任何实用程序都将使用进程的完整列表(对进行一些readdir /proc)。我认为,他们将遍历/proc数字子文件夹并检查找到的每个进程是否匹配。

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

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


1
杀手不是过时的。在Linux外部可能无法移植,但是问题是关于Linux的。

1
要获取用户列表,请使用以下一种衬里:getent passwd | awk -F:“ {print $ 1}”
Petesh

我如何从C system()调用命令:“ kill -ju UID”呢?

1
它是嵌入式Linux吗?你没有技能,杀手和杀手吗?即使是busybox嵌入式外壳也具有pkill和killall。
osgx 2011年

2
killall -u USERNAME像魅力一样工作
michalzuber 2015年

8

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

su -c 'kill -TERM -1' bob

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

if (fork() == 0) {
    setuid(uid);
    signal(SIGTERM, SIG_DFL);
    kill(-1, SIGTERM);
}

5

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

ps -ef | grep username | grep -v grep | awk '{print $2}' | xargs kill

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


或者只是pkill -U username
osgx 2011年


0

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

ps U <username> | cut -d " " -f 1 | xargs kill
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.