大约一周前,我的 cron 守护进程拒绝继续运行。我在 OpenVZ 虚拟机上使用 Debian 6 x64。运行类似的东西pgrep cron
表明守护进程没有运行。我用service cron start
或启动服务/etc/init.d/cron start
并启动,但几分钟后它从正在运行的进程列表中消失(在进程再次被终止之前的 1 - 30 分钟之间变化)。
使用strace -f service cron start
,我可以看到该进程由于某种原因被终止:
nanosleep({60, 0}, <unfinished ...>
+++ killed by SIGKILL +++
/var/log/syslog
, , ,中没有任何相关内容/var/log/messages
,/var/log/auth.log
也/var/log/kern.log
无法解释该进程为何终止。系统至少有 800 MB 的空闲内存,并且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
?
查看
/proc/user_beancounters
,更具体地说,查看failcnt
列。对于所有非零条目,您需要相应地增加
barrier
/limit
,这可能只是 OpenVZ 杀死了您的进程来命中它们。以下是每一列的说明:http ://wiki.openvz.org/Proc/user_beancounters
经过反复试验,我偶然发现了一种解决方法。出于某种原因,
cron
只有在守护进程模式下运行时才会被杀死(大概是被主机杀死)。如果使用 启动cron -f
,该过程将持续存在。所以,我创建了一个简单的脚本来在前台启动它(并在它确实被杀死的不太可能的情况下不断重新启动它):然后我通过启动这个启动器脚本
nohup cronrestart >/dev/null &
,让它在后台运行。这样cron到目前为止已经运行了一个星期没有被杀死。我想下一步是尝试让启动器脚本在后台自行启动,以更好地模拟
cron
.