O script Bash não está funcionando corretamente no crontab

3

Eu tenho alguns scripts que funcionam perfeitamente se você executá-los a partir de um terminal, mas depois de adicioná-los ao crontab, é como se o bash não fosse executado corretamente e não continuasse com a primeira instrução IF. parar.

#!/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

Como eu disse, esse script funciona perfeitamente se você executá-lo a partir de um terminal, mas não com o crontab. O cronjob para este script é:

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

Eu mudei o SHELL em / etc / crontab de SHELL = / bin / sh para / bin / bash e ainda não funciona.

Alguém poderia me ajudar a descobrir o que está errado com meu script e crontab?

Atenciosamente.

    
por Raul Sanchez 10.12.2015 / 00:31

1 resposta

2

Ao escrever um scrpit para o cron, há certas coisas que você deve lembrar:

  1. Nunca assuma que está sendo executado em qualquer lugar específico. Altere manualmente para um local predefinido (cd) com uma das suas primeiras operações ou sempre use caminhos absolutos para tudo . Isso inclui sua linha "source config.sh" - onde está esse arquivo config.sh ...?
  2. Pode não ter a mesma variável de ambiente PATH de quando você a executa manualmente. Se você fizer referência a qualquer coisa que não esteja nos locais binários do sistema padrão (/ bin / usr / bin), será necessário especificar manualmente uma variável PATH diferente ou, novamente, usar nomes de caminho absolutos completos para seus comandos. Isso inclui ainda / sbin e / usr / sbin - alguns sistemas não têm isso no PATH padrão para usuários não-root.

Para a depuração, certifique-se de que a variável MAILTO esteja definida no crontab para que saiba para onde enviar os relatórios de erro. Você também pode adicionar "-x" à sua linha de hashbang para mostrar todos os comandos no stdout à medida que eles são executados - o que o cron deve enviar para você.

    
por Majenko 10.12.2015 / 01:51