我尝试运行 Sikulix 脚本,但没有任何反应。
crontab:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/home/absolute
MAILTO=""
# m h dom mon dow user command
00 3 * * * root sh /usr/crons/this_script_works
10 3 1-5 * * root /home/absolute/runsikulix -r /home/absolute/auto/test.sikuli
如果我使用此命令运行它,脚本将运行良好:
sudo /home/absolute/runsikulix -r /home/absolute/auto/test.sikuli
任何想法?
答案1
您需要捕获难以捉摸的 crontab 输出,这样您才能看到它在抱怨什么。
将 -x 添加到您的 shebang 中以便在脚本中获得详细输出:
#!/bin/sh -x
设置 cron 作业,以便在排除故障时更频繁地执行:
*/1 * * * * root /home/absolute/runsikulix -r /home/absolute/auto/test.sikuli
Crontab 默认应该将日志记录到 /var/log/syslog。运行grep CRON /var/log/syslog
并检查输出。如果您看到您的作业正在执行,那么您可以tail -f
在 cron 运行时查看系统日志,看看它在抱怨什么。
- 如果输出不够详细,您可以按照以下说明重新配置 cron 以输出到日志文件。这是“正确”的做法:
这应该会向您显示 crontab 正在执行的每个步骤,以便您了解其失败之处。我要指出的是,crontab 的环境非常简陋,您应该在脚本中使用完整路径而不是相对路径,因为您调用的任何二进制文件在运行时可能在您的路径中可用,也可能不可用。Crontab 就是这么有趣。要解决这个问题,您可以向脚本添加路径:
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
...或者您可以使用其完整路径调用每个二进制文件:
/bin/echo "say something" && /bin/which java
您还可以以内联方式调用用户的环境:
0 5 * * * . /root/.profile; /home/absolute/runsikulix -r /home/absolute/auto/test.sikuli
下面是在 root 的 crontab 下运行的 Ruby 模板格式的示例脚本,它说明了处理环境问题的一些解决方法: