太多Cron Jobs给我“bash:fork:资源暂时不可用”

时间:2012-01-07 08:21:36

标签: process cron osx-lion sh bin

我注意到今天有些crons没有执行,因为我在日志文件中得到以下错误行:

/bin/sh: fork: Resource temporarily unavailable

我做了一些研究,发现它可能与允许用户运行的进程数有关。

然后我跑了:

top -u

确实有大量的shcurl进程,我认为这些进程不应该存在。

大多数进程都是对运行某些数据库维护任务的本地php文件的简单调用。

所有进程都在我的本地计算机上运行,​​因此我可以完全访问所有内容。如果我知道如何,我会更改限制,但我无法在Mac OS X Lion上找到与此问题相关的任何信息。

另外,我不确定为什么这些进程在执行后不会消失。

有没有办法在执行后杀死进程?

任何正确方向的暗示都将非常感激! 感谢

1 个答案:

答案 0 :(得分:1)

你唯一能做的就是使用lockfiles来保证每个特定的cronjob只运行一个实例。最简单的方法是使用cron-scripts中的lockfiles。 (“合作锁定”):

  • 启动时,(cron)作业测试锁文件是否存在
  • 如果锁定文件恰好存在,则作业在另一个进程上执行kill -0 <pid>(#1)
  • 如果来自kill的错误代码为零,则该进程实际存在且来自同一用户ID。新工作应该退出。 (#2)
  • 如果来自kill的错误代码不为零,则该进程不再存在(正常)或属于另一个(无关的)进程以用于其他uid
  • 如果进程不存在,新作业可以继续创建锁文件,并将其pid写入其中(#3)
  • 现在可以执行实际有效负载
  • 最后可以删除锁文件。

#1:kill -0是无操作的;它只检查pid的有效性

#2:pid很可能属于我们pid的无关过程。我们可以通过检查ps的输出来完善搜索,并检查pid是否实际上属于我们的cron作业的旧实例。

#3:这不是没有比赛的,但对于每分钟运行一次的cronjob来说,它可能已经足够了。