如何找出哪个进程正在消耗待处理信号?

如何找出哪个进程正在消耗待处理信号?

用户尝试运行特定程序时收到以下消息。

timer_create:资源暂时不可用

来自 StackOverflow 的问答,标题为:timer_create() : -1 EAGAIN(资源暂时不可用),我发现这与待处理信号的空间不足有关。我通过运行以下命令使用单独的用户帐户确认了这一点:

$ ulimit -i 0

并检查我是否遇到了同样的错误,确实如此。使用此命令:

$ ulimit -i 1

或任何更高的金额都没有错误。

当原始用户运行时,ulimit -i他们得到 127368。因此我得出的结论是,他们已经用完了未决信号的空间。

到底是怎么回事?这是否意味着一个或多个正在运行的程序已经消耗了这些?如果是这样,我如何找出哪些?

答案1

嗯,这不是一个漂亮的解决方案,但至少可能是A解决方案。

其中/proc/[pid]/status有 SigPnd 和 ShdPnd 的条目。它们被描述为,

SigPnd、ShdPnd:线程和整个进程待处理的信号数量(请参阅 pthreads(7) 和 signal(7))。

还有 SigQ,

SigQ:该字段包含两个斜杠分隔的数字,与该进程的真实用户 ID 的排队信号相关。第一个是该真实用户 ID 当前排队信号的数量,第二个是该进程排队信号数量的资源限制(请参阅 getrlimit(2) 中 RLIMIT_SIGPENDING 的描述)。

(所有这些都来自man 5 proc)。

因此,您可以搜索 中的所有 pid /proc,检查其status文件,并找到带有任何待处理信号的 pid。

尝试这个,

cd /proc

find . -name "status" | xargs grep SigPnd 2> /dev/null | grep -v "0000000000000000"

find . -name "status" | xargs grep ShdPnd 2> /dev/null | grep -v "0000000000000000"

相关内容