大约一周前,我的 cron 守护进程拒绝继续运行。我在 OpenVZ 虚拟机上使用 Debian 6 x64。运行类似命令显示守护进程未运行。我使用或pgrep cron
启动服务,它启动了,但几分钟后它从正在运行的进程列表中消失(在进程再次被终止之前,大约 1 到 30 分钟)。service cron start
/etc/init.d/cron start
使用strace -f service cron start
,我可以看到该进程由于某种原因被终止:
nanosleep({60, 0}, <unfinished ...>
+++ killed by SIGKILL +++
/var/log/syslog
、、、或中没有任何相关内容可以解释为什么该进程正在终止。系统至少有 800 MB 的可用内存,并且/var/log/messages
返回,因此资源不应该是问题。运行时,报告:/var/log/auth.log
/var/log/kern.log
cat /proc/loadavg
0.22 0.13 0.04
cron
free -m
total used free shared buffers cached
Mem: 1024 211 812 0 0 0
-/+ buffers/cache: 211 812
Swap: 0 0 0
我也尝试cron
使用 删除并重新安装该包apt-get
。
更新:我最初以为是资源问题。我删除了整个 VPS,然后从全新的 Debian 映像启动。现在系统上没有其他程序在运行,但即使是全新安装,我的 cron 守护程序仍然会随机被终止。
我还应该检查什么?如何找出导致我崩溃的原因crond
?
答案1
/proc/user_beancounters
更具体地说,请查看该failcnt
列。
对于所有非零条目,您需要相应地增加 / barrier
,limit
这可能只是 OpenVZ 终止了您击中它们的进程。
以下是每一列的描述:http://wiki.openvz.org/Proc/user_beancounters
对于可核算参数,字段 held 显示容器的当前计数器(资源“使用情况”),字段 maxheld 显示上一个核算周期的计数器最大值。核算周期通常是容器的生命周期。
字段 failcnt 显示进程组整个生命周期内被拒绝的“资源分配”的次数。
屏障和限制字段是资源控制设置。对于某些参数,只能使用其中之一,对于某些参数 — 两者都可以使用。这些字段可能指定限制或保证,它们的确切含义是特定于参数的。UBC 参数中每个参数的描述包含有关该参数的屏障和限制之间的差异的信息。
答案2
经过多次尝试和错误,我偶然发现了一个解决方法。出于某种原因,cron
只有在守护进程模式下运行时才会被终止(可能是由主机终止)。如果使用启动cron -f
,则该进程将继续存在。因此,我创建了一个简单的脚本来在前台启动它(并在不太可能被终止的情况下不断重新启动它):
#!/bin/bash -u
while [ 1 ]; do
logger -i -t cronrestart -p cron.warn "Launching cron daemon"
cron -f
logger -i -t cronrestart -p cron.warn "Cron daemon killed"
done
logger -i -t cronrestart -p cron.warn "Quitting"
然后我通过启动此启动器脚本,nohup cronrestart >/dev/null &
以便它在后台运行。到目前为止,Cron 已经以这种方式运行了一个星期,没有被终止。
我想下一步应该是尝试让启动器脚本在后台自行启动以更好地模拟的守护进程模式cron
。