web-dev-qa-db-fra.com

Le script Bash ne fonctionne pas correctement avec crontab

Certains scripts fonctionnent parfaitement si vous les exécutez depuis un terminal, mais une fois ajoutés à crontab, c'est comme si la bash n'exécutait pas correctement et ne continuait pas avec la première instruction IF et le script semblait vouloir s'arrêter.

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

Comme je l'ai dit, ce script fonctionne parfaitement si vous l'exécutez depuis un terminal, mais pas avec crontab. Le cronjob pour ce script est:

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

J'ai changé le shell dans/etc/crontab de Shell =/bin/sh à/bin/bash et ne fonctionne toujours pas.

Quelqu'un pourrait-il m'aider à trouver ce qui ne va pas avec mon script et ma crontab?

Cordialement.

2
Raul Sanchez

Lorsque vous écrivez un scrpit pour cron, vous devez vous rappeler certaines choses:

  1. Jamais Supposons qu'il fonctionne à partir d'un endroit particulier. Soit vous passez manuellement à un emplacement prédéfini (cd) avec l’une de vos premières opérations, soit utilisez toujours des chemins absolus pour tout. Cela inclut votre ligne "source config.sh" - où se trouve ce fichier config.sh ...?
  2. Il se peut que la variable d’environnement PATH ne soit pas la même que lorsque vous l’exécutez manuellement. Si vous faites référence à quelque chose qui ne se trouve pas dans les emplacements binaires système standard (/ bin/usr/bin), vous devrez soit spécifier manuellement une autre variable PATH, soit utiliser à nouveau des noms de chemin absolus complets pour vos commandes. Cela inclut même/sbin et/usr/sbin - certains systèmes ne l’ont pas dans le PATH par défaut pour les utilisateurs non root.

Pour le débogage, assurez-vous que la variable MAILTO est définie dans la crontab afin qu’elle sache où envoyer les rapports d’erreur. Vous pouvez également ajouter "-x" à votre ligne hashbang pour afficher toutes les commandes sur stdout au fur et à mesure de leur exécution - lequel cron devrait alors vous envoyer un mail.

2
Majenko