web-dev-qa-db-fra.com

docker exec ne fonctionne pas dans cron

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

29
user555

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/
75
VDR

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!

7
Jason Hughes

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

4
mbarthelemy

débogage cron

1. /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.

2. crond et $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

3. Forcer l'enregistrement

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

Le script finalisé pourrait ressembler à:

#!/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/

Drapeau exécutable

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
2
F. Hauri

Ê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 .

1
rdupz

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.

1
SaintHax