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.
Merci, je vais essayer ça. – sudocode
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