在 bash 脚本中循环执行 ls,资源暂时不可用?

在 bash 脚本中循环执行 ls,资源暂时不可用?

我有一个过程有时需要几个小时才能完成,并且不是运行 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,等等。

相关内容