我的 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
。
如果有任何其他选项,请不要在 cron 作业中执行 sudo。
travelcoCheck.sh
将被 grep travelco
匹配并且不会被 grep -v grep
取消,因此 wc -l
将始终至少为 1。所以restart_tomcat.sh
不会运行。
(附带说明:您的 ps
解析堆栈是否被 ps
捕获是一种黑暗艺术,充满了极端情况和竞争条件,通常很难开始工作吧。像这样的东西就是发明 dbus
的原因。)
我创建了一个 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
。
如果有任何其他选项,请不要在 cron 作业中执行 sudo。
travelcoCheck.sh
将被grep travelco
匹配并且不会被grep -v grep
取消,因此wc -l
将始终至少为 1。所以restart_tomcat.sh
不会运行。
(附带说明:您的 ps
解析堆栈是否被 ps
捕获是一种黑暗艺术,充满了极端情况和竞争条件,通常很难开始工作吧。像这样的东西就是发明 dbus
的原因。)