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
Duplicata possible de Pourquoi mon crontab ne fonctionne-t-il pas et comment puis-je le résoudre ?
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.
0 votes
@allanberry : désolé, cron n'a pas encore la capacité de lire dans les pensées. Vous devez être intelligent.
0 votes
@IporSircer ok, réponse sarcastique, mais point pris. :) J'ai ajusté ma crontab pour échelonner le script à des intervalles de 5 minutes, et je mettrai à jour ceci la semaine prochaine, je suppose, après que le script hebdomadaire ait eu la chance de s'exécuter.
0 votes
Je pense que vous devez déplacer la logique de synchronisation dans le script. Je ne pense pas que cron soit ton ami pour ça. IE exécutez le script toutes les heures, et laissez le script décider du niveau qu'il doit faire. Ou faites quelque chose pour vous assurer qu'une seule copie du script est exécutée à un moment donné.
1 votes
@DylanMartin La "logique de synchronisation" n'est-elle pas le but de cron ?
0 votes
Non ! ;-) Cron est vraiment stupide. C'est un type qui regarde une liste et dit "est-ce déjà l'heure ?" et qui lance un interrupteur quand c'est le cas.
0 votes
En fait, le script de sauvegarde devrait empêcher d'être exécuté plusieurs fois. Je peux voir dans la configuration ci-dessus où cela pourrait être problématique et causer des sauvegardes corrompues en fonction du contenu du script.
0 votes
Mec... downvote pour quoi ? foule difficile.
0 votes
@mdpc veuillez élaborer ; pourquoi le script de sauvegarde empêcherait-il d'être exécuté plusieurs fois ? Que voyez-vous dans la configuration ci-dessus qui pourrait être problématique ? Ce genre de choses est exactement ce que j'essaie de discerner, bien sûr.
0 votes
J'ai mis à jour le cron pour qu'il n'y ait pas de chevauchement des exécutions, mais je suis perdu.
1 votes
Avez-vous jeté un coup d'œil à la sortie du processus de sauvegarde actuel ? Avez-vous essayé d'envoyer des courriels via la fonction cron
MAILTO=email@address.com
contenant la sortie complète des cas de réussite et d'échec ?0 votes
@AndreKlärner Merci d'avoir demandé ; oui, je l'ai fait ; la sortie mailto est exactement la même que dans le fichier journal : juste un échec pour créer le fichier.