问题

使用 cron 服务运行脚本,该脚本通常从 shell 执行,但在从 crontab 运行时不会表现出相同的行为。

更多: zhilu jiaocheng

根本原因

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 以获取执行的输出。
如果任何变量未定义或者脚本有其他错误,输出将更容易找到问题的原因。

在crontab中,Cron 脚本未按预期执行
日期:2020-09-17 00:13:01 来源:oir作者:oir