working run not name have container compose app bash meteor docker cron meteor-up

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!