我的 cron 作业没有按预期工作,为什么?

My crond job doesn't work as expected, why?

我创建了一个 shell 脚本来检查 tomcat 实例状态。如果实例没有启动,则启动它:

if [ `ps -ef | grep 'travelco' | grep -v grep | wc -l` -eq 0 ];then
sudo /home/q/tools/bin/restart_tomcat.sh /home/www/travelco/
else
  echo 'travelco started'
fi

然后我测试了脚本,它运行良好。但是在我将它添加为 crond 作业之后,这个脚本没有按预期工作。 我使用了 crontab -e,并添加了

*/1 * * * * /home/yuliang.jin/travelcoCheck.sh

在那之后,即使我可以在 crontab 日志中看到执行的脚本(sudo tail -f /var/log/cron),tomcat 实例也没有启动。为什么?

您的脚本中有一个 sudo 但您确定您当前的用户有权在没有密码验证的情况下执行 /home/q/tools/bin/restart_tomcat.sh 吗?

您应该将脚本添加到 /etc/sudoers 以允许您的当前用户在没有密码的情况下执行脚本,或者您可以只 sudo crontab -e 到 运行 root 用户的脚本(并且不要如果这样做,请不要忘记在脚本中删除 sudo

  1. 如果有任何其他选项,请不要在 cron 作业中执行 sudo。

  2. travelcoCheck.sh 将被 grep travelco 匹配并且不会被 grep -v grep 取消,因此 wc -l 将始终至少为 1。所以restart_tomcat.sh不会运行。

(附带说明:您的 ps 解析堆栈是否被 ps 捕获是一种黑暗艺术,充满了极端情况和竞争条件,通常很难开始工作吧。像这样的东西就是发明 dbus 的原因。)