2012-01-22 2 views
0

Voici un extrait d'un script que j'exécute généralement de Cron:Pourquoi une partie d'un script exécuté par cron échoue sauf si stderr est dirigé vers/dev/null?

if [ "$RESCAN_COMMAND" = "wipecache" ]; then 
    log "Linking cover art." 
    find $FLAC_DIR -name "*.jpg" | while read f; do c=`echo $f | sed -e 's/flac/mp3/g'`; ln -s "$f" "$c"; done 
    log "Done linking cover art" 
fi 

Le script fonctionne parfaitement lorsqu'il est exécuté à partir de la ligne de commande. Mais lorsqu'il est exécuté par cron (comme le même utilisateur), il échoue quelque part dans la ligne find. Le message "Terminé" n'est pas consigné et le script ne continue pas au-delà du bloc if. La ligne find crée des liens à partir de fichiers tels que flac/Artist/Album/cover.jpg vers mp3/Artist/Album/cover.jpg. Il y a quelques centaines de fichiers à lier. La commande génère beaucoup de sortie à stderr, car la plupart, sinon la totalité, des liens existent déjà.

Sur une intuition, j'ai essayé de rediriger l'stderr de la commande ln-/dev/null:

find $FLAC_DIR -name "*.jpg" | while read f; do c=`echo $f | sed -e 's/flac/mp3/g'`; ln -s "$f" "$c" 2>/dev/null; done 

Avec ce changement, le script exécute avec succès de Cron (ainsi que de la ligne de commande).

Je serais intéressé de comprendre pourquoi.

Répondre

1

elle produit probablement trop sortie. Ce n'est vraiment pas un bug, mais une fonctionnalité car cron envoie généralement des emails avec sa sortie. MTA n'aime pas les messages texte avec beaucoup de nombreuses lignes, donc cron se ferme juste. Peut-être que le silence est un bug.

Vous pouvez également utiliser ln -f pour supprimer les erreurs ln uniquement dans le cas de fichiers préexistants.

+0

Merci, je vais essayer ça. – sudocode

+0

J'accepte cette réponse parce que vous avez expliqué la raison pour laquelle le cron a échoué, et c'est ce que j'ai demandé. (De plus, ln -f est plus propre que de rediriger vers/dev/null, j'ai modifié mon script pour le faire.) – sudocode

Questions connexes