Bash 脚本无法通过 crontab 正常运行

Bash 脚本无法通过 crontab 正常运行

我有一些脚本,如果从终端运行它们,它们会完美运行,但是一旦将它们添加到 crontab,就好像 bash 无法正确执行,不会继续执行第一个 IF 语句,并且脚本似乎停止了。

#!/bin/bash

## File: opt_files_backup.sh
## Author: Raul Sanchez
## Last update: 09/12/2015
## Description:

## Includes the configuration file for the FTP connection
## Available variables (FTP): $ftp_user, $ftp_pass, $ftp_server, $ftp_source_directory, $ftp_target_directory
## Available variables (mail): $mail_recipients
## Available variables (Logging): $log_files
source config.sh

## Creates a tar.gz backup with the format opt_files_YYYYmmdd.tar.gz
if tar czfP /opt/backup-scripts/src/files/opt_files-`date +%Y%m%d%H%M`.tar.gz /opt --exclude='/opt/backup-scripts';
then
echo -e "`date` - Files Backup OK" >> $log_files
## Remove files older than 7 days
if find /opt/backup-scripts/src/files/*.tar.gz -mtime +7 -exec rm {} \;
then
    ##------ Connect to remote server and synchronize ------##
            ## ftp::ssl-allow is false by default on /root/.lftprc
    if lftp -e "mirror --reverse --delete --verbose $ftp_source_directory $ftp_target_directory; exit" -u $ftp_user,$ftp_pass $ftp_server;
            then
        echo -e "`date` - Files Backup Mirror Transfer OK" >> $log_files
                ##------ Send email notification to Sys Admin ------##
            echo "The task completed successfully at `date`" | mail -e -s "CRONTAB task #2 OPT Files Mirror" $mail_recipients
    else
        echo -e "`date` - Files Backup Mirror Transfer KO" >> $log_files
        exit 1
    fi
fi
else
echo -e "`date` - Files Backup Mirror Backup KO" >> $log_files
##------ Send email notification failure to Sys Admin ------##
echo "The task didn't completed at `date`, something went wrong. Please check $log_files for more information." | mail -e -s "CRONTAB task #2 OPT Files Mirror Failed!"  $mail_recipients
exit 1
fi

正如我所说,如果您从终端运行此脚本,它会完美运行,但使用 crontab 则不行。此脚本的 cronjob 是:

0   7,10,13,16  *   *   1-5 /opt/backup-scripts/scripts/opt_files_backup.sh

我已将 /etc/crontab 中的 SHELL 从 SHELL=/bin/sh 更改为 /bin/bash,但仍然不起作用。

有人能帮我找出我的脚本和 crontab 出了什么问题吗?

问候。

答案1

为 cron 编写脚本时,必须记住某些事项:

  1. 绝不假设它正在从任何特定位置运行。要么使用您的第一个操作之一手动更改为预定义位置 (cd),要么始终使用绝对路径名一切。这包括您的“source config.sh”行 - 该 config.sh 文件在哪里……?
  2. 它可能没有与手动运行时相同的 PATH 环境变量。如果您引用标准系统二进制位置 (/bin /usr/bin) 中没有的内容,则您必须手动指定不同的 PATH 变量或再次为命令使用完整的绝对路径名。这甚至包括 /sbin 和 /usr/sbin - 某些系统在非 root 用户的默认 PATH 中没有这些。

为了进行调试,请确保在 crontab 中设置了 MAILTO 变量,以便它知道将任何错误报告发送到哪里。您还可以将“-x”添加到 hashbang 行,以在执行所有命令时在 stdout 上显示它们 - 然后 cron 会向您发送邮件。

相关内容