0

今天我注意到在一些 crons 没有按应有的方式执行后,我在日志文件中收到以下错误行:

/bin/sh: fork: Resource temporarily unavailable

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

然后我运行:

top -u

确实有很多我认为不应该存在的过程shcurl

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

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

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

执行后有什么方法可以杀死进程吗?

任何正确方向的提示将不胜感激!谢谢

4

1 回答 1

1

您可以做的唯一明智的事情是使用锁定文件来保证每个特定的 cronjob 只运行一个实例。最简单的方法是使用 cron 脚本中的锁定文件。(“合作锁定”):

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

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

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

#3:这不是无竞争的,但对于每分钟运行一次的 cronjob 来说可能已经足够了。

于 2012-01-07T13:05:40.677 回答