大约一个星期前,我的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/messages /var/log/auth.log或/var/log/kern.log没有任何相关内容可以解释为什么进程正在死亡。 系统至less有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
我也尝试使用apt-get删除并重新安装cron软件包。
更新:我最初认为这个问题是一个资源问题。 我删除了我的整个VPS,并从一个新的Debian图像开始。 现在系统上还没有其他的东西在运行,但是即使从干净的安装中我的cron守护进程仍然被随机杀死。
我还应该检查什么? 我如何知道什么是我的crond ?
看看/proc/user_beancounters ,更具体地说,在failcnt列。
对于所有非零的条目,您需要相应地增加barrier / limit ,可能只是OpenVZ会使您的进程遭到攻击。
这里是每个列的描述: http : //wiki.openvz.org/Proc/user_beancounters
对于可负责的参数,保存的字段显示容器的当前计数器(资源“使用量”),字段maxheld显示计数器在上一个会计期间的最大值。 会计期间通常是集装箱的寿命。
现场故障处理器显示进程组整个生命周期中被拒绝的“资源分配”的数量。
屏障和限制字段是资源控制设置。 对于某些参数,只有其中的一个参数可以使用。 这些字段可以指定限制或保证,其确切含义是参数特定的。 UBC参数中每个参数的描述都包含有关屏障与参数极限之间的差异的信息。
经过多次的试错,我偶然发现了一个解决方法。 出于某种原因,如果cron正在以守护进程模式运行,它只会被杀死(大概是由主机)。 如果用cron -f启动,这个过程依然存在。 所以,我创build了一个简单的脚本来在前台启动它(并在不太可能发生的情况下不断重启它):
#!/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 &启动这个启动脚本nohup cronrestart >/dev/null &所以它在后台运行。 克朗已经这样跑了一个星期,没有被打死。
我想下一步就是试着让启动脚本在后台启动,以更好地模拟cron的守护进程模式。