我正在尝试每 15 分钟运行一次 bash 脚本作为 cron 作业。
bash 脚本简单地调用 Java 程序。我在 crontab 中设置了每 15 分钟运行一次文件并保存了它,但它什么也没做?
crontab -e
*/15 * * * * /home/marshell/graphite_cronjobs/Run_Cron_Read_Send_CapacityData_To_Graphite.sh
运行_Cron_读取_发送_容量数据_到_Graphite.sh
java Cron_Read_Send_CapacityData_To_Graphite >> Cron_Read_Send_CapacityData_To_Graphite.log
答案1
这里可能存在两个问题。首先,cron 在一个特殊的 shell 中运行作业,该 shell 不会读取您的个人 $PATH。如果java
不在/usr/bin
或中/bin
,则 cron 将无法使用它。来自man 5 crontab
:
cron(8) 守护进程会自动设置几个环境变量。SHELL 设置为 /bin/sh,LOGNAME 和 HOME 则从 crontab 所有者的 /etc/passwd 行中设置。
PATH 设置为“/usr/bin:/bin”。 HOME、SHELL 和 PATH 可能会被 crontab 中的设置覆盖;LOGNAME 是运行该作业的用户,并且可能无法更改。
因此,请改用完整路径java
。下一个问题是您的 bash 脚本在具有相对路径的文件上调用 java。它假定脚本将从与 java 文件相同的目录启动。同样,事实并非如此。因此,如果您希望脚本按 cron 的预期运行,请始终使用绝对路径:
/path/to/java /path/to/Cron_Read_Send_CapacityData_To_Graphite >> /path/to/Cron_Read_Send_CapacityData_To_Graphite.log
$PATH
或者,您可以在 crontab 本身中设置:
PATH=$PATH:/opt/bin
*/15 * * * * /home/marshell/graphite_cronjobs/Run_Cron_Read_Send_CapacityData_To_Graphite.sh