我知道killall5,系统V的kill命令。
是否有类似的东西,我可以向所有用户进程(包括主机操作系统和来宾操作系统)发送 SIGSTOP?
可能killall -SIGSTOP?
答案1
如果你真的很想这么做,以下由 root 执行,将发送STOP
信号到一切:
kill -STOP -1
但这会极大地破坏你的系统,所以不要那样做。
指定-1
为进程 ID(来自kill()
SUSv4 中的 C 库规范):
如果 pid 为 -1,则 sig 应发送到该进程有权发送该信号的所有进程(不包括一组未指定的系统进程)。
由用户执行,这将对该用户拥有的所有进程执行相同的操作,包括当前的 shell。所以也不要那样做。
停止特定用户的所有进程,而不是存在该用户(即您是root):
pkill -STOP -u otheruser
sudo
如果您在登录时执行此操作,因为otheruser
它仍然会搞砸您,所以也不要那样做。
STOP
我可以看到发送到用户的所有进程的唯一原因是当该用户是运行数量非常有限的事物的守护程序用户时。
还有记得CONT
稍后再发..
答案2
pkill(请参阅 pgrep)是一个命令行实用程序,最初是为与 Solaris 7 操作系统一起使用而编写的。此后,它已针对 Linux 和某些 BSD 重新实现。
与kill 和killall 命令一样,pkill 用于向进程发送信号。 pkill 命令允许使用扩展正则表达式模式和其他匹配条件。
要向给定用户的所有进程发出信号,请使用:
pkill -signal <signalname> -u <userid> //(by default it will send SIGTERM)
您可以在运行 pgrep 之前对其进行测试,以查看将发出信号的进程名称和 pid:
pgrep -u <userid> -l
您可以将任何信号(参见 参考资料kill -l
)与 pkill 一起使用。看man pkill
手册页中的信息
pgrep 浏览当前正在运行的进程,并将与标准输出的选择标准相匹配的进程 ID 列出。所有标准都必须匹配。
例如,pgrep -u root sshd
只会列出名为 sshd 并且由 root 拥有的进程。另一方面,
pgrep -u
root,daemon
将列出 root 或守护进程拥有的进程。
pkill 会将指定的信号(默认为 SIGTERM)发送到每个进程,而不是在 stdout 上列出它们。
选项
-d delimiter
设置用于分隔输出中每个进程 ID 的字符串(默认为换行符)。 (仅限 pgrep。)
-f
该模式通常仅与进程名称匹配。设置 -f 时,将使用完整命令行。
-g pgrp,...
仅匹配列出的进程组 ID 中的进程。进程组 0 被转换为 pgrep 或 pkill 自己的进程组。
-G gid,...
仅匹配列出了真实组 ID 的进程。可以使用数值或符号值。
-l
列出进程名称以及进程 ID。 (仅限 pgrep。)
-n
仅选择最新(最近启动的)匹配进程。
-o
仅选择最旧(最近最少启动)的匹配进程。
-P ppid,...
仅匹配其父进程 ID 已列出的进程。
-s sid,...
仅匹配列出了进程会话 ID 的进程。会话 ID 0 被转换为 pgrep 或 pkill 自己的会话 ID。
-t term,...
仅匹配其控制终端已列出的进程。指定的终端名称不应包含“/dev/”前缀。
-u euid,...
仅匹配列出了有效用户 ID 的进程。可以使用数值或符号值。
-U uid,...
仅匹配列出真实用户 ID 的进程。可以使用数值或符号值。
-v
否定匹配。
-x
仅匹配其名称(或命令行,如果指定了 -f)与模式完全匹配的进程。
-signal
定义发送到每个匹配进程的信号。可以使用数字或符号信号名称。 (仅限 pkill。)
答案3
Kill 允许 PID 参数使用特殊值-1
,这意味着“该进程有权发送该信号的所有进程(不包括一组未指定的系统进程)”,因此这应该类似于调用给killall5
定的情况下会执行的操作STOP 信号的编号:
kill -SIGSTOP -1