Mysql
scripts de sauvegarde ne fonctionnant pas en tant que root crontab - help
J'essaie d'exécuter une crontab en tant que root, mais le script ne s'exécute pas correctement. Je peux voir dans syslog que le script est en cours d'exécution, mais il ne se termine pas.
Mar 28 04:01:01 ubuntumaster CRON[16812]: (root) CMD home/wayne/scripts/mysql_backup.sh)
L'exécution du script en ligne de commande fonctionne très bien ... voici le script:
MyUSER="root" # USERNAME
MyPASS="devan13" # PASSWORD
MyHOST="localhost" # Hostname
# Linux bin paths, change this if it can not be autodetected via which command
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
CHOWN="$(which chown)"
CHMOD="$(which chmod)"
GZIP="$(which gzip)"
# Backup Dest directory, change this if you have someother location
DEST="/home/wayne/backup"
# Main directory where backup will be stored
MBD="$DEST/mysql"
# Get hostname
Host="$(hostname)"
# Get data in dd-mm-yyyy format
NOW="$(date +"%d-%m-%Y")"
# File to store current backup file
FILE=""
# Store list of databases
DBS=""
# DO NOT BACKUP these databases
IGGY="thisdatabaseschema thatdatabase herdata mydata"
[ ! -d $MBD ] && mkdir -p $MBD || :
# Only root can access it!
$CHOWN 0.0 -R $DEST
$CHMOD 0600 $DEST
# Get all database list first
DBS="$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse 'show databases')"
for db in $DBS
do
skipdb=-1
if [ "$IGGY" != "" ];
then
for i in $IGGY
do
[ "$db" == "$i" ] && skipdb=1 || :
done
fi
if [ "$skipdb" == "-1" ] ; then
FILE="$MBD/$db.$Host.$NOW.gz"
# do all inone job in pipe,
# connect to mysql using mysqldump for select mysql database
# and pipe it out to gz file in backup dir :)
$MYSQLDUMP --quick -u $MyUSER -h $MyHOST -p$MyPASS $db | $GZIP -9 > $FILE
fi
done
Merci, Wayne
Sauf si vous avez ignoré certains caractères lors de l'écriture du résultat de syslog dans votre question, il semble que vous ayez créé une faute de frappe dans votre commande CRON en oubliant le caractère/devant la commande qui devrait ressembler à ceci:
/home/wayne/scripts/mysql_backup.sh
Assurez-vous de courir:
Sudo crontab -e
(or crontab -e as root)
Et ajoutez le script souhaité:
*/15 * * * * /bin/bash /home/wayne/scripts/mysql_backup.sh
Cela lancera le cron toutes les 15 minutes, évidemment vous voudrez peut-être changer cela.
j'utilise ce script et l'appelle un jour "gestionnaire de cronjob facile"
Mon argent est sur Benoit
pour avoir la réponse vraiment correcte ici, mais dès que vous pourrez vérifier que votre script s'exécute, vous trouverez probablement des erreurs supplémentaires.
En bref, vérifiez également votre environnement! Vous êtes à mi-chemin en utilisant des variables qui définissent l'emplacement des commandes (MYSQL="$(which mysql)"
) mais which mysql
lit simplement votre PATH
pour déterminer sa sortie. which
dans un script comme celui-ci ne fait rien, vous pouvez aussi simplement écrire mysql
lorsque la commande est utilisée, ou coder en dur l'emplacement de mysql
dans la variable au lieu d'utiliser which
pour essayer de le renseigner pour vous.
Lors d’un test d’installation Ubuntu x64 12.04.3, * * * * * env > test.out
dans une crontab indique que la variable PATH
est /usr/bin:/bin
. Si l'une de vos commandes n'existe pas dans cette PATH
, elle ne s'exécutera pas correctement!
En guise de suggestion finale, ajoutez set -x
en haut de votre script bash (en supposant qu'il s'agisse de bash) pour déboguer ce que le script est en train de faire.
Problème résolu. La tâche cron courait chaque nuit mais ne se terminait pas. Le problème était avec le script. Le shell cron n’a pas interprété "==" comme étant égal, c’est-à-dire que dans le shell cron, "1 == 1" a été évalué comme faux. Cependant, lorsque j'ai exécuté le programme en ligne de commande, cela a fonctionné. J'ai lu quelque part que le bash Shell comprend == ou = veut dire égal ... mais le bourne Shell n'interprète pas "==" comme égal ... j'ai dû remplacer mon "==" par "=" et cela a fonctionné bien. Merci pour l'aide. Wayne