2016-05-11 3 views
0

J'ai un script qui fonctionne parfaitement lorsque je le lance manuellement, mais ne semble pas fonctionner correctement depuis crontab.Le script Cronjob ne fonctionne pas comme prévu

L'erreur principale est que les variables d'environnement (externes) ne sont pas définies.

J'ai ajouté SHELL=/bin/bash au-dessus de la définition de cronjob mais j'ai quand même obtenu les mêmes erreurs.

Le script que j'ai copié et collé ci-dessous. Vive l'aide

#!/bin/bash 
# export MYSQL_PORT_3306_TCP_ADDR=`awk 'NR==1 {print $1}' /etc/hosts` 

set -e 

MOUNT=/mnt/s3b/ 
BACKUP=/root/backups 
mkdir -p $BACKUP 
NOW=$(date +"%Y-%m-%d-%H%M") 
DB_FILE="$MYSQL_ENV_MYSQL_DATABASE.$NOW.sql" 

/usr/bin/s3fs <bucket_name> $MOUNT -ouse_cache=/tmp -odefault_acl=public-read -ononempty 

mysqldump -h$MYSQL_PORT_3306_TCP_ADDR -uroot -p$MYSQL_ENV_MYSQL_ROOT_PASSWORD $MYSQL_ENV_MYSQL_DATABASE > /tmp/$DB_FILE 

tar -czvf $BACKUP/"$DB_FILE.tar.gz" -P /tmp/$DB_FILE 

cp $BACKUP/"$DB_FILE.tar.gz" $MOUNT/data/ 

L'erreur que vous pouvez voir ci-dessous toutes les variables d'environnement retour:

May 11 00:17:59 fcf074b9e5ee kernel: [293368.874868] SELinux: mount invalid. Same superblock, different security settings for (dev mqueue, type mqueue) 
May 11 00:18:14 fcf074b9e5ee kernel: [293383.903080] docker0: port 6(veth2f6467f) entered forwarding state 
May 11 01:29:26 fcf074b9e5ee s3fs[78]: s3fs.cpp:s3fs_init(3334): init v1.79(commit:unknown) with OpenSSL 
May 11 01:29:26 fcf074b9e5ee s3fs[78]: s3fs.cpp:s3fs_check_service(3729):  Could not connect wrong region us-east-1, so retry to connect region eu-west-1. 
May 11 01:31:10 fcf074b9e5ee s3fs[93]: s3fs.cpp:s3fs_init(3334): init v1.79(commit:unknown) with OpenSSL 
May 11 01:31:10 fcf074b9e5ee s3fs[93]: s3fs.cpp:s3fs_check_service(3729): Could not connect wrong region us-east-1, so retry to connect region eu-west-1. 
    May 11 10:25:02 fcf074b9e5ee kernel: [329791.913331] hrtimer: interrupt took 2331455 ns 

    mysqldump -h -uroot -p > /tmp/.2016-05-11-0015.sql 
+3

Où sont toutes les variables comme 'MYSQL_ENV_MYSQL_ROOT_PASSWORD' de $ définie? –

+1

Qu'avez-vous défini comme votre crontab? Une chose que vous pouvez essayer est de définir votre '.profile' avant votre crontab comme ceci:' 0 0 * * *. ~/.profile; votre script crontab' –

+0

Vous avez posé la même question hier, puis vous l'avez supprimée. Encore une fois: comment avez-vous mis en place votre cronjob? – fedorqui

Répondre

0

Comme @ qui-autre-type a fait remarquer, les variables d'environnement MYSQL_ENV_MYSQL_DATABASE $, MYSQL_ENV_MYSQL_ROOT_PASSWORD $ sont pas encore défini.

Les variables d'environnement sont héritées du processus vers les enfants lorsqu'un processus se déroule. Cela signifie que les travaux crontab hériteront de l'environnement du service crontab. Les variables d'environnement définies dans le shell lorsque vous installez le travail crontab ne seront pas conservées.

Vous devez ajouter dans votre script shell:

MYSQL_ENV_MYSQL_DATABASE="mydatabase" 
MYSQL_ENV_MYSQL_ROOT_PASSWORD="mypassword"