问题
使用 cron 服务运行脚本,该脚本通常从 shell 执行,但在从 crontab 运行时不会表现出相同的行为。
根本原因
crontab 作业未正确执行的最常见原因之一是 cronjob 未在用户的 shell 环境下运行。
另一个原因可能是未指定脚本中使用的命令的绝对路径。
手动运行脚本时,环境变量(例如 PATH)可能与从 cron 运行时不同。
因此,始终建议包含脚本中使用的命令的绝对路径。
因此,在 cron 作业执行期间,普通 shell 中存在的用户的任何环境变量都将不可用,除非它们被脚本显式导入。
例如,如果 shell 定义了一个 ORACLE_HOME 变量并将其包含在 PATH 环境变量中,并且脚本使用这些变量,则脚本将在销售中执行,但是当从 crontab 运行时,脚本将不知道这些变量默认情况下。
解决方案
在 cron 脚本文件中定义或者导入 ORACLE_HOME 和完整的 PATH 变量,正如我们在 oracle 用户 shell (oracle_user_shell> echo $PATH) 中看到的那样。
一个好的做法是始终在脚本 script.sh 的开头使用以下命令导入用户环境:
#!/bin/bash . /home/oracle/.bashrc [rest of script]
这将读取 /home/oracle/.bashrc 并导入其中的环境。
根据用户的环境,也可以是/home/oracle/.bash_profile 或者其他文件。
注意:点“.”和"/home"之间有一个空格。
提示:为了更好地对 crontab 条目执行进行故障排除,我们可以将其更改为将输出记录到文件中,例如:
[* * * * *] /home/oracle/script.sh 2> /tmp/crontab_script_log.txt 2>&1
注意:将[* * * * *]
替换为我们的正确执行时间。
然后,我们可以检查 /tmp/crontab_script_log.txt 以获取执行的输出。
如果任何变量未定义或者脚本有其他错误,输出将更容易找到问题的原因。