2012-10-12 3 views
0

J'ai un code comme ceci:Débogage mon application Cron

set -e 
set -x 
folderName=$(echo `date +%Y/%m/%d/`); 
fileName=x.x.x.x.x.x.x.log 
cp x.x.x.x.x.x/$1 $fileName 
gzip $fileName 
s3cmd put $fileName.gz s3://x.x.x.x.x/$folderName  
rm $fileName.gz 

Cela fonctionne bien si je lance comme ceci:

./shell logfilelocation 

Et quand j'ajouté dans la crontab comme ceci:

* * * * * /home/x.x.x/testing/s3 -f x.x.x.log >> /tmp/mys3Log 

Et j'ai attendu! Le fichier mys3Log est créé. Mais il n'y a pas de contenu dedans! Je m'attends à ce que le résultat de l'exécution de la commande (comme j'ai utilisé set -e ; set -x dans mon code) devrait aller dans le fichier mys3Log pendant que je fais une redirection là.

Mais quelque chose ne va pas. Je suis très nouveau pour bash programmation et cron.

Où est-ce que je fais l'erreur?

Merci d'avance.

Répondre

1

cron n'ont pas le même environnement comme dans un shell interactif, donc au début du script, après le tralala, ajouter:

source ~/.bashrc || source /etc/profile 

Et enlever set -e pour voir ce qui se passe.

Dans votre crontab, enregistrer les erreurs & sortie (STDERR, STDOUT), vous devez faire:

* * * * * /home/x.x.x/testing/s3 -f x.x.x.log >> /tmp/mys3Log 2>&1 

De plus, la ligne 4 de votre script, vous utilisez les $name variables des thats est jamais déclaré . Enfin, comme Janauary a dit, ajoutez le #!/bin/bash shegang sur la première ligne et assurez-vous que votre script a des droits exécutables. :

+0

La ligne 'la source ~/.bashrc || source/etc/profile' devrait être ajouté dans le fichier cron? – sriram

+0

Merci pour la réponse, vous n'avez pas répondu à ma question commentaire. – sriram

+0

Je reçois une erreur en tant que 's3cmd: commande non trouvée' dans mon fichier journal cron. – sriram

0

Comme mentionné dans la réponse précédente, le cron fonctionne dans un environnement différent de celui de votre shell. Ce qui signifie que les variables d'environnement seraient différentes dans shell. Pour exemple:

En shell:

$ echo $PATH 
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin 

Alors que si vous exécutez la commande suivante dans Cron:

* * * * * echo $PATH > path.out 

vous obtiendrez /usr/bin:/bin.

Découvrez où est votre exécutable s3cmd en utilisant la commande which s3cmd puis modifiez le cron en conséquence. Par exemple:

$ which s3cmd 
/usr/local/bin/s3cmd 

Ensuite, Cron devrait ressembler à:

PATH=/usr/bin:/bin:/usr/local/bin 
* * * * * echo $PATH > path.out 
Questions connexes