本文共 1147 字,大约阅读时间需要 3 分钟。
在使用Linux系统时,可能会遇到以下情况:某个命令在直接在shell下执行时没有问题,但在crontab定时任务中却失败。例如,执行命令java -jar /home/opscoder/topo-audit.jar
在shell下能成功,但在crontab中设置为每天的凌晨10点执行却会失败。
为了解决这个问题,首先需要查看crontab执行日志以确定具体错误原因。不同Linux发行版的日志存储位置有所不同:
在Ubuntu等Debian系统中,crontab的日志可以通过检查/var/spool/mail/root
文件来观察。使用tail -f /var/spool/mail/root
可以实时查看最近的日志。
在AIX或HP-UX系统中,crontab的日志存储在/var/spool/cron/tmp
目录下。通过查看这个目录下的临时文件可以看到任务执行情况。
在RedHat、SUSE等Linux发行版中,crontab的日志通常位于/var/log/cron
文件中。使用tail -f /var/log/cron
可以实时查看任务执行情况。
通过查看日志可以发现,错误提示为/bin/sh: java command not found
。这意味着crontab使用的并非系统的环境变量,而是其自身的环境变量。通常,crontab会从/bin/sh
环境中获取命令解释器,而不是从/etc/profile
获取。因此,当需要执行需要特定环境变量的命令时,直接在crontab中运行可能会失败。
为了解决这个问题,可以采取以下方法:
通过脚本间接执行命令:将crontab任务从直接执行Java程序改为执行一个脚本。例如,将crontab任务修改为:
0 10 * * * /home/opscoder/topo-check.sh
这样可以避免crontab直接解析命令,减少环境变量相关的问题。
创建并执行脚本:创建一个名为topo-check.sh
的bash脚本,内容如下:
#!/bin/bashsource /etc/profilejava -jar /home/opscoder/topo-audit.jar
然后赋予脚本执行权限:
chmod +x topo-check.sh
这样可以确保脚本在执行时使用正确的环境变量,避免crontab解析命令时的环境变量问题。如果当前用户无法启动crontab,可以通过以下步骤解决:1. 使用具有sudo权限或启动权限的用户先启动crontab服务:
service cron start
2. 切回原用户后,再次创建或编辑crontab任务:
crontab -e
通过以上方法,可以成功解决crontab执行Java程序失败的问题。
转载地址:http://mbkfk.baihongyu.com/