J'ai une commande assez simple qui fonctionne très bien en tant que commande ou script bash mais pas quand je le mets dans crontab
40 05 * * * bash /root/scripts/direct.sh >> /root/cron.log
qui a la ligne suivante
PATH=$PATH:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
Shell=/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin:/root/
# Mongo Backup
docker exec -it mongodb mongodump -d meteor -o /dump/
J'ai essayé de changer l'URL du script en /usr/bin/scirpts/
pas de chance
J'ai même essayé d'exécuter le script directement dans cron
26 08 * * * docker exec -it mongodb mongodump -d meteor -o /dump/ >> /root/cron.log
sans chance, aucune aide appréciée.
MODIFIER
Je ne vois aucune erreur dans /root/cron.log
fichier soit
Votre docker exec
commande indique qu'il a besoin de "pseudo-terminal et s'exécute en mode interactif" ( - il marque ) tandis que cron ne s'attache à aucun TTY.
Essayez de changer votre commande docker exec pour cela et voyez si cela fonctionne?
docker exec mongodb mongodump -d meteor -o /dump/
pour ce que ça vaut, j'ai eu exactement le même problème. Corriger votre PATH, modifier les autorisations et vous assurer que vous exécutez en tant qu'utilisateur docker approprié sont toutes de bonnes choses, mais ce n'est pas suffisant. Cela va continuer à échouer car vous utilisez "docker exec -it", qui indique à docker d'utiliser un shell interactif. Changez-le en "docker exec -t" et cela fonctionnera bien. Cependant, aucune sortie de journal ne vous le dira. Prendre plaisir!
1) Assurez-vous que cette tâche se trouve dans la crontab de l'utilisateur root - c'est probablement le cas mais vous ne l'avez pas écrite explicitement
2) cron
peut ne pas trouver bash
. Je le supprimerais et appellerais directement votre script après l'avoir rendu exécutable:
chmod 755 /root/scripts/direct.sh
puis définissez votre entrée crontab sur 40 05 * * * /root/scripts/direct.sh 2>&1 >> /root/cron.log
Si cela ne fonctionne toujours pas, vous devriez avoir une sortie utile dans /root/cron.log
/var/log
ou sendmail
Comme crond
fonctionne comme un démon, sans possibilité d'échec, l'exécution est plus importante que la journalisation. Par défaut, en cas de problème, cron
enverra un e-mail à $USER@localhost
signalant la sortie du script et les erreurs.
Jettes un coup d'oeil à /var/mail
ou /var/spool/mail
pour certains mails, peut-être
et à /etc/aliases
pour voir où se trouvent les messages de root.
$PATH
Lorsque vous exécutez une commande par cron, veillez à ce que $PATH
est le chemin par défaut de l'utilisateur et pas le chemin par défaut de la racine (c'est-à-dire pas de */sbin
et autre chemin réservé vers les outils superutilisateur).
Pour cela, la manière la plus simple est d'imprimer votre chemin par défaut dans l'environnement où tout se passe bien:
echo $PATH
ou patchez votre script depuis la ligne de commande:
sed -e "2aPATH='$PATH'" -i /root/scripts/direct.sh
Cela ajoutera $PATH
initialiseur à la ligne 2 de votre script.
Ou alors, extraira de votre script tous les autres PATH=
:
sed -e "s/PATH=[^ ]*\( \|$\)/\1/;2aPATH='$PATH'" -i /root/scripts/direct.sh
Ajoutez en haut de votre script:
exec 1>/tmp/cronlog-$$.log
exec 2>/tmp/cronlog-$$.err
Essaye ça:
sed -e '1a\\nexec 1>/tmp/cronlog-$$.log\nexec 2>/tmp/cronlog-$$.err' -i ~/scripts/direct.sh
#!/bin/bash
# uncomment two following lines to force log to /tmp
# exec 1>/tmp/cronlog-$$.log
# exec 2>/tmp/cronlog-$$.err
PATH='....' # copied from terminal console!
docker exec -it mongodb mongodump -d meteor -o /dump/
Si vous exécutez votre script par
40 05 * * * bash /root/scripts/direct.sh
aucun indicateur exécutable n'est requis, mais vous devez les ajouter:
chmod +x ~/scripts/direct.sh
si vous voulez exécuter:
40 05 * * * /root/scripts/direct.sh
Êtes-vous sûr que votre script est en cours d'exécution? Ajoutez une autre commande comme touch /tmp/cronok
avant le docker exec
appel.
N'oubliez pas que le crontab a besoin d'une nouvelle ligne à la fin. Utilisation crontab -e
pour le modifier.
Redémarrez le service cron et consultez les journaux (grep -i cron /var/log/syslog
).
Si votre système d'exploitation est redhat/centos/Fedora, vous devriez essayer avec le nom d'utilisateur (root
) entre la fréquence et la commande.
Vérifiez vos e-mails avec la commande mail
.
Vérifiez les autorisations crontab. chmod 644 /etc/crontab
.
Peut-être que vous ne voulez tout simplement pas réinventer la roue .
Voici quelques choses que je changerais - premièrement, capturez STDERR avec STDOUT et supprimez la spécification Shell dans cron - utilisez #! dans votre script à la place.
40 05 * * * /root/scripts/direct.sh &>> /root/cron.log
Ensuite, vous définissez votre PATH dans l'ordre inverse et votre shbang vous manque. Je ne sais pas pourquoi vous définissez Shell comme/bin/sh, lorsque vous exécutez bash, au lieu de dash. Modifiez votre script en ceci.
#!/usr/bin/env bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/root
PATH=$PATH:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
# Mongo Backup
docker exec -it mongodb mongodump -d meteor -o /dump/
Voyez si cela donne quelque chose de mieux à travailler.