我有一个过程有时需要几个小时才能完成,并且不是运行 ls 来查看相关文件是否被删除以标记任务的完成,而是有一个脚本,它只是一遍ls foldernames
又一遍地运行,中间有 5 秒钟的休眠时间。
它达到了预期目的(不要问我为什么没有更好的通知系统,这只是一个临时解决方案)。但是,如果脚本运行很长时间(一个小时?),它不会输出目录内容,而是显示以下错误:
./loop.sh: fork: retry: Resource temporarily unavailable
./loop.sh: fork: retry: Resource temporarily unavailable
./loop.sh: fork: retry: Resource temporarily unavailable
为什么会发生这种情况?该脚本对服务器有什么负面影响吗?
谢谢!
答案1
fork()
是创建新进程的系统调用1。每当您运行命令时,您都会创建一个进程。当您运行像 这样的管道时date | od -ab
,您会创建两个进程。但通常情况下,在您创建的进程终止并消失之前,您不会返回 shell 提示符(或者,如果适用,继续执行脚本中的下一行)。
但是,当您在后台运行命令时(例如,使用command &
),您可以继续执行其他操作,而无需等待您创建的进程终止。这可能是一项非常强大的功能,但它可以轻松创建大量进程。并且存在限制,超过该限制您将获得“资源暂时不可用”。
您确定是您的监控脚本导致了问题(还是只是出现了症状)?这个“有时需要几个小时才能完成的进程”是什么?它导致问题的原因是什么?它是编译后的二进制可执行文件吗?还是也是脚本?如果是二进制文件,您有源代码吗?
您可以尝试以下方法来隔离问题:
- 开始“一次几小时”的过程。等待一个小时(如果有帮助的话,可以使用闹钟或沙漏)然后然后启动监控脚本。它是否很快就失败了?如果是这样,问题可能出在“一次运行数小时”的过程中。它是否运行了一个小时(这将是第二每次执行“小时一次”过程的小时数)然后失败? 如果是这样,问题可能出在监控脚本中。
- 将 sleep 从 5 改为 30。一小时后它仍然会失败吗?如果是这样,问题可能出在“一次几个小时”的过程中。它能坚持六个小时吗?如果是这样,问题可能出在监控脚本中。
- 查看脚本,看看是否有任何命令包含
&
。 有命令吗wait
? 如果“一次几小时”过程是脚本,请对其执行相同操作。 如果它是一个编译程序,并且您有源代码,请查看它以查找对fork()
、vfork()
和spawn()
(system()
和wait()
)的调用,看看您是否能弄清楚发生了什么。 - 作为最后的手段, 编辑您的问题需要包含所有相关的细节(包括上述测试的结果),然后也许有人可以给您一个具体的答案。
回答你的最后一个问题:是的,耗尽任何资源对系统都是不利的。________
1
或者,至少fork()
是一创建新进程的系统调用。
PS 您的问题标题表明您怀疑这ls
是原因,但错误消息却没有说明。错误也可能来自 —sleep
或者,更准确地说,错误消息可能是交替出现的:一个来自ls
,一个来自sleep
,一个来自ls
,一个来自sleep
,等等。