用户尝试运行特定程序时收到以下消息。
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"