bash - run - docker exec no está funcionando en cron
docker exec run (6)
Tengo un comando bastante simple que funciona bien como un comando de comando o bash, pero no cuando lo puse en crontab
40 05 * * * bash /root/scripts/direct.sh >> /root/cron.log
que tiene la siguiente linea
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/
Intenté cambiar la URL del script a /usr/bin/scirpts/
no luck
Incluso traté de ejecutar el script directamente en cron
26 08 * * * docker exec -it mongodb mongodump -d meteor -o /dump/ >> /root/cron.log
Sin suerte, cualquier ayuda apreciada.
EDITAR
No veo ningún error en el archivo /root/cron.log
tampoco
depuración cron
1. /var/log
o sendmail
Como crond
funciona como un demonio, sin la capacidad de fallar, la ejecución es más importante que el registro. Entonces, de forma predeterminada, si algo sale mal, cron
enviará un correo a la salida del script de informes $USER@localhost
y errores.
Eche un vistazo a /var/mail
o /var/spool/mail
para algunos correos, tal vez
y en /etc/aliases
para ver dónde están enviados los correos de root.
2. crond y $PATH
Cuando ejecute un comando por cron, tenga cuidado de que $PATH
sea la ruta de acceso predeterminada del usuario y no la ruta de acceso predeterminada de la raíz (es decir, no */sbin
y otra ruta reservada a las herramientas de superusuario).
Para esto, la forma más sencilla es imprimir su ruta predeterminada en el entorno donde todo funciona bien:
echo $PATH
o parche su script desde la línea de comando:
sed -e "2aPATH=''$PATH''" -i /root/scripts/direct.sh
Esto agregará el inicializador actual de $PATH
en la línea 2 de su script.
O esto, borrará de tu script todas las demás PATH=
:
sed -e "s/PATH=[^ ]*/( /|$/)//1/;2aPATH=''$PATH''" -i /root/scripts/direct.sh
3. Forzar el registro
Agregue en la parte superior de su script:
exec 1>/tmp/cronlog-$$.log
exec 2>/tmp/cronlog-$$.err
Prueba esto:
sed -e ''1a//nexec 1>/tmp/cronlog-$$.log/nexec 2>/tmp/cronlog-$$.err'' -i ~/scripts/direct.sh
El guión finalizado podría verse así:
#!/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/
Bandera ejecutable
Si ejecuta su script por
40 05 * * * bash /root/scripts/direct.sh
no se requiere ningún indicador ejecutable, pero debe agregarlos:
chmod +x ~/scripts/direct.sh
si quieres correr:
40 05 * * * /root/scripts/direct.sh
¿Estás seguro de que tu script se está ejecutando? Agregue otro comando como touch /tmp/cronok
antes de la llamada docker exec
.
No olvides que el crontab necesita una nueva línea al final. Usa crontab -e
para editarlo.
Reinicie el servicio cron y verifique los registros ( grep -i cron /var/log/syslog
).
Si su sistema operativo es redhat / centos / fedora, debe probar con el nombre de usuario ( root
) entre la frecuencia y el comando.
Revise sus correos con el comando de mail
.
Compruebe los permisos crontab. chmod 644 /etc/crontab
.
Tal vez simplemente no quieres reinventar la rueda .
1) Asegúrate de que esta tarea esté en el crontab del usuario raíz . Probablemente sea el caso, pero no lo escribiste explícitamente.
2) cron
puede ser incapaz de encontrar a bash
. Lo eliminaría y llamaría directamente a su script después de hacerlo ejecutable:
chmod 755 /root/scripts/direct.sh
y luego configure su entrada crontab como 40 05 * * * /root/scripts/direct.sh 2>&1 >> /root/cron.log
Si aún no funciona, debería tener algún resultado útil en /root/cron.log
Aquí hay algunas cosas que cambiaría: primero, capture STDERR junto con STDOUT y elimine la especificación de shell en cron: use #! en su guión en su lugar.
40 05 * * * /root/scripts/direct.sh &>> /root/cron.log
A continuación, está configurando su RUTA en el orden inverso, y falta su shbang. No tengo idea de por qué está definiendo SHELL como / bin / sh, cuando está ejecutando bash, en lugar de dash. Cambie su guión a esto.
#!/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/
A ver si eso produce algo mejor para trabajar.
El comando docker exec
dice que necesita "pseudo terminal y se ejecuta en modo interactivo" ( indicadores -it ) mientras que cron no se adjunta a ningún TTY.
Intente cambiar su comando exec docker a esto y ver si funciona?
docker exec mongodb mongodump -d meteor -o /dump/
Por lo que valía, tuve exactamente el mismo problema. Arreglar su ruta de acceso, cambiar los permisos y asegurarse de que se está ejecutando como el usuario adecuado de la ventana acoplable son cosas buenas, pero eso no es suficiente. Continuará fallando porque estás usando "docker exec -it", que le dice a la ventana acoplable que use un shell interactivo. Cámbielo a "docker exec -t" y funcionará bien. Sin embargo, no habrá salida de registro en ninguna parte que le diga esto. ¡Disfrutar!