3 votes

Pourquoi la sauvegarde de script échoue avec cron ?

Je fais donc des sauvegardes automatiques d'une base de données. Le script de sauvegarde fonctionne correctement, à la fois lorsque je l'exécute manuellement, et aussi lorsque Cron exécute des sauvegardes horaires et quotidiennes programmées. La sauvegarde échoue, cependant, sur les sauvegardes hebdomadaires et mensuelles.

Je ne suis (évidemment) pas sûr, mais je suppose que mon problème vient de la configuration du cron. Peut-être un conflit parce que le script est exécuté plusieurs fois à minuit ? Je ne suis pas sûr que ce soit possible, mais si c'est le cas, j'apprécierais des instructions pour affiner ma crontab.

ma crontab :

# *  *  *  *  * user-name  command to be executed
  00 *  *  *  *   /data/backup.sh -h  #hourly
  00 00 *  *  *   /data/backup.sh -d  #daily
  00 00 *  *  6   /data/backup.sh -w  #weekly
  00 00 1  *  *   /data/backup.sh -m  #monthly

edit : J'ai mis à jour ma crontab pour avoir des minutes échelonnées, mais ça ne fonctionne toujours pas :

# *  *  *  *  * user-name  command to be executed
  00 *  *  *  *   /data/backup.sh -h  #hourly
  05 00 *  *  *   /data/backup.sh -d  #daily
  10 00 *  *  6   /data/backup.sh -w  #weekly
  15 00 1  *  *   /data/backup.sh -m  #monthly

J'y accède par cette commande :

sudo crontab -u my_user_group_name -e

version linux :

$ cat /proc/version 
Linux version 3.10.0-514.6.1.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) ) #1 SMP Wed Jan 18 13:06:36 UTC 2017

Le script de sauvegarde fonctionne bien tout seul, lorsqu'il est exécuté en tant que script script manuel, avec l'un des drapeaux (-h, -d, -w, -m). Il fonctionne sans faute. Il s'agit d'une sauvegarde de Wordpress script, utilisant wp-cli qui permet essentiellement de sérialiser une base de données MariaDB. Par souci d'exhaustivité, j'ai inclus le script à la fin de cette question.

J'ai examiné de près les généralités Conseil de dépannage cron à partir de cette réponse mais je ne vois rien d'applicable à mon problème :

  • Je ne pense pas que le problème soit avec le script de sauvegarde lui-même, car le problème ne se produit que pendant les exécutions cron, pas lorsqu'il est exécuté directement dans le script. Heureux que quelqu'un puisse me prouver que j'ai tort.
  • Je ne pense pas que le problème soit lié à l'environnement général, mais plutôt à la configuration de cron elle-même (ci-dessus), puisque le problème ne se produit que pendant certaines exécutions de cron, alors que d'autres s'exécutent avec succès. Par exemple, la Crontab n'est pas mal nommée, elle a des autorisations correctes, etc.
  • La réponse de cron ne dit rien sur la fréquence des exécutions de cron, les conflits entre les exécutions ou d'autres dynamiques qui, à mon avis, sont probablement à l'origine du problème.

Voici les permissions pour les répertoires de sauvegarde en question (en /data/backup/ . Comme vous pouvez le constater, les répertoires horaire et hebdomadaire ont les mêmes permissions.

drwxr-xr-x. 2 libsys  libsys   4096 Feb 20 00:05 daily
drwxrwxr-x. 2 root    backup   4096 Feb 20 10:00 hourly
-rw-rw-r--. 1 root    backup  35644 Feb 20 10:00 log.txt
drwxrwxr-x. 2 root    backup   4096 Feb 13 11:23 manual
drwxrwxr-x. 2 aberry3 aberry3  4096 Feb  6 10:36 monthly
drwxrwxr-x. 2 aberry3 aberry3  4096 Feb  6 10:36 weekly

Je viens de remarquer que les permissions quotidiennes n'ont pas de groupe d'écriture ; je vais corriger cela et revenir ici dans une semaine. C'est probablement un faux-fuyant, cependant ; mon problème n'est pas avec les sauvegardes quotidiennes, qui fonctionnent bien : seules les sauvegardes hebdomadaires et mensuelles n'ont pas lieu.

Voici la sauvegarde script :

#!/bin/bash

# Usage
# This script will make a backup of the WordPress database, into the
# defined backup directory, "/data/backups".
# Options are -hdwm, for "hourly", "daily", "weekly", "monthly"; these
# simply put the backups into different subdirectories.  Running the script
# without options creates four backups, one in each directory.
# The script also "cleans up" the directories afterward.

# constants
WP_DIR=/var/www/wordpress/docroot
DATA_DIR=/data/backups
LOG=$DATA_DIR/log.txt

# vars
TIMESTAMP=$(date +%Y-%m-%d.%H-%M-%S)

# run all commands from WP root directory
cd $WP_DIR

# the meat of the backup script
backup () { # arguments: "hourly", "daily", "weekly", "monthly", "manual"
  INTERVAL=$1
  BACKUP_DIR=$DATA_DIR/$INTERVAL

  # create directory hierarchy if not exists
  mkdir -p $BACKUP_DIR

  # create backup
  FILENAME=$(printf "%s/wp-mariadb-%s.sql" "$BACKUP_DIR" "$TIMESTAMP")
  /usr/local/bin/wp db export $FILENAME

  # make sure backup happened
  if [ -s $FILENAME ]
  then
      echo "   backup OK   $TIMESTAMP $INTERVAL" >> $LOG
  else
      echo "!!! backup FAIL $TIMESTAMP $INTERVAL" >> $LOG
      exit 1 # terminate and indicate error
  fi

  # clean up backup directory
  BACKUP_FILES=$BACKUP_DIR/*.sql
  case $INTERVAL in
    "hourly")
      KEEP=24
      ;;
    "daily")
      KEEP=7
      ;;
    "weekly")
      KEEP=4
      ;;
    "monthly")
      KEEP=12
      ;;
    "manual")
      KEEP=999 # don't automatically delete manual backups
      ;;
  esac

  # evaluate which files to delete from directory
  for BACKUP in $BACKUP_FILES; do
    # if (BACKUP_FILES quantity > KEEP)
    # and if (BACKUP age in minutes) > (minutes ago)
      # delete backup
    ARR=($BACKUP_FILES) # convert to array
    LEN=${#ARR[@]} # length of array

    # if we have too many backups...
    if (($LEN > $KEEP)); then
      # ...delete the backup.
      rm $BACKUP
    fi
  done
}

# run particular backup scripts depending on options
while getopts "hdwma" arg; do
  case $arg in
    h)
      backup "hourly"
      ;;
    d)
      backup "daily"
      ;;
    w)
      backup "weekly"
      ;;
    m)
      backup "monthly"
      ;;
    a)
      # a stands for all; backup everywhere
      backup "hourly"
      backup "daily"
      backup "monthly"
      ;;
    *)
      echo "Error: command not recognized"
      echo "!!! backup FAIL $TIMESTAMP illegal option in '$1'" >> $LOG
      ;;
  esac
done

voici un échantillon de mon fichier journal, montrant simplement le problème :

...
   backup OK   2017-02-17.22-00-01 hourly
   backup OK   2017-02-17.23-00-01 hourly
   backup OK   2017-02-18.00-00-02 hourly
   backup OK   2017-02-18.00-05-01 daily
!!! backup FAIL 2017-02-18.00-10-02 weekly
   backup OK   2017-02-18.01-00-01 hourly
   backup OK   2017-02-18.02-00-02 hourly
   backup OK   2017-02-18.03-00-02 hourly
   backup OK   2017-02-18.04-00-02 hourly
   backup OK   2017-02-18.05-00-01 hourly
   backup OK   2017-02-18.06-00-01 hourly
   backup OK   2017-02-18.07-00-01 hourly
   backup OK   2017-02-18.08-00-02 hourly
   backup OK   2017-02-18.09-00-02 hourly
   backup OK   2017-02-18.10-00-01 hourly
   backup OK   2017-02-18.11-00-04 hourly
   backup OK   2017-02-18.12-00-03 hourly
   backup OK   2017-02-18.13-00-02 hourly
   backup OK   2017-02-18.14-00-02 hourly
   backup OK   2017-02-18.15-00-01 hourly
   backup OK   2017-02-18.16-00-02 hourly
   backup OK   2017-02-18.17-00-04 hourly
   backup OK   2017-02-18.18-00-02 hourly
   backup OK   2017-02-18.19-00-02 hourly
   backup OK   2017-02-18.20-00-02 hourly
   backup OK   2017-02-18.21-00-02 hourly
   backup OK   2017-02-18.22-00-03 hourly
   backup OK   2017-02-18.23-00-02 hourly
   backup OK   2017-02-19.00-00-03 hourly
   backup OK   2017-02-19.00-05-02 daily
   backup OK   2017-02-19.01-00-03 hourly
   backup OK   2017-02-19.02-00-02 hourly
   backup OK   2017-02-19.03-00-01 hourly
...

5 votes

Vous exécutez en parallèle 3 instances du script mensuellement et hebdomadairement. Cela peut poser un problème.

2 votes

0 votes

@IporSircer ouais, je pensais que peut-être, mais je me suis dit que le système serait assez intelligent pour les mettre en file d'attente.

3voto

Brandon Xavier Points 1922

Cette commande :

sudo crontab -u my_user_group_name -e

Combiné avec la variété des propriétaires d'utilisateurs et de groupes de vos répertoires de sauvegarde :

drwxr-xr-x. 2 libsys  libsys   4096 Feb 20 00:05 daily
drwxrwxr-x. 2 root    backup   4096 Feb 20 10:00 hourly
-rw-rw-r--. 1 root    backup  35644 Feb 20 10:00 log.txt
drwxrwxr-x. 2 root    backup   4096 Feb 13 11:23 manual
drwxrwxr-x. 2 aberry3 aberry3  4096 Feb  6 10:36 monthly
drwxrwxr-x. 2 aberry3 aberry3  4096 Feb  6 10:36 weekly

Ça a l'air louche. Je suppose que l'utilisateur réel - en supposant que vous n'avez pas vraiment un utilisateur nommé my_user_group_name -- n'est pas aberry3 . Si je devais deviner, je dirais que libsys exécute le script qui est un membre de backup mais pas un membre de aberry3 groupes.

Puisque vous créez les répertoires dans le script de toute façon, essayez de renommer vos répertoires existants et laissez le script les créer avec le propriétaire/groupe de l'utilisateur réel exécutant le script.

0 votes

Merci. Oui, je pense que c'est la réponse. J'ai totalement négligé la propriété du répertoire, et c'était juste là dans ce que j'ai posté. Une erreur totale de débutant je suppose. Je vais vérifier cela quand je serai au bureau demain. Merci beaucoup.

1voto

Franco Figue Points 11

Essayez,

sudo chown root:backup weekly

0 votes

Donc vous pensez que c'est un problème avec le propriétaire du script ? Pourquoi est-ce que ça fonctionne bien pour les horaires/quotidiens ?

0 votes

Cela reviendrait à changer la propriété du répertoire. Je doute que cela fasse une différence.

1voto

user373333 Points 630

Ajouter un peu plus de journalisation au script.

Ajoutez "-x" à la première ligne du script.

#!/bin/bash -x

Cela devrait vous donner une sortie plus verbeuse du script dans l'email qui est envoyé à l'adresse qui est spécifiée dans l'option cron "MAILTO".

En outre, selon la documentation ( https://wp-cli.org/commands/db/export/ ) vous pouvez ajouter "--debug" à la commande "wp db export". Essayez comme ceci.

/usr/local/bin/wp db export --debug $FILENAME

Vous pouvez poster le contenu du courrier que vous recevez lorsque le script échoue, cela devrait vous/nous donner suffisamment de données pour localiser le problème.

0 votes

Merci ! Je vais tenter le coup, et je reviendrai vers vous quand j'en saurai un peu plus.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X