【问题标题】:My crond job doesn't work as expected, why?我的 cron 工作没有按预期工作,为什么?
【发布时间】:2018-10-17 11:52:38
【问题描述】:

我创建了一个 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 实例也没有启动。为什么?

【问题讨论】:

  • 你不需要给 /1 。默认情况下,如果您使用 * ,cron 将每分钟运行一次。所以使用* * * * * /home/yuliang.jin/travelcoCheck.sh
  • 谢谢,但为什么脚本没有按预期执行?我的意思是实例已启动。但是当我执行“/home/yuliang.jin/travelcoCheck.sh”时,就可以启动了。@jQuery.PHP.Magento.com
  • 你的意思是你直接在Shell里敲Sh文件然后回车,它就运行了吗?
  • 你说the tomcat instance was not started.,那就开始吧。

标签: linux shell cron


【解决方案1】:

您的脚本中有一个sudo,但您确定您当前的用户有权执行/home/q/tools/bin/restart_tomcat.sh 而无需密码验证?

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

【讨论】:

    【解决方案2】:
    1. 如果有任何其他选项,请不要在 cron 作业中使用 sudo。

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

    (附带说明:无论您的 ps-parsing 堆栈是否被 ps 捕获,都是一种黑暗艺术,充满了极端情况和竞争条件,通常很难正常工作。东西这就是为什么 dbus 被发明的原因。)

    【讨论】:

    • 是的,我将比较部分更改为“if [ps -ef | grep java | grep travelco | wc -l -eq 0]”,这次成功了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-02-29
    • 2014-08-04
    • 2021-01-03
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多