cronjob no ejecuta una secuencia de comandos que funciona bien independiente

Tengo mi archivo de script php en /var/www/html/dbsync/index.php . Cuando cd /var/www/html/dbsync/ y ejecuta php index.php funciona perfectamente.

Quiero llamar al archivo PHP a través del archivo sh, la ubicación del archivo SH es la siguiente

 /var/www/html/dbsync/dbsync.sh 

Este es el contenido del archivo dbsync.sh es:

 /usr/bin/php /var/www/html/dbsync/index.php >> /var/www/html/dbsync/myscript.log 2>&1 -q -f 

Cuando cd /var/www/html/dbsync/ y ejecuto ./dbsync.sh , funciona perfectamente también.

Ahora si configuro crontab como a continuación:

 1 * * * * /var/www/html/dbsync/dbsync.sh /var/www/html/dbsync 

Sin embargo, este crontab no está funcionando como se esperaba.

¿Qué puede estar mal?

Como se ve en los comentarios, el problema es que no está definiendo qué progtwig se debe usar para ejecutar el script. Tenga en cuenta que un cronjob se ejecuta en un entorno pequeño; allí, no se puede asumir mucho. Es por eso que definimos caminos completos, etc.

Entonces necesitas decir algo como:

 1 * * * * /bin/sh /var/www/html/dbsync/dbsync.sh /var/www/html/dbsync # ^^^^^^^ 

/bin/sh es el binario que quieres usar para ejecutar el script.

De lo contrario, puede establecer permisos de ejecución para el script y agregar un encabezado de shell-script indicándole qué intérprete usar:

 #!/bin/sh 

Si haces esto, no es necesario agregar la ruta del binario.

De Solución de problemas comunes con trabajos cron :

Usando rutas relativas Si su tarea cron está ejecutando un script de algún tipo, debe asegurarse de usar solo rutas absolutas dentro de ese script. Por ejemplo, si su script se encuentra en /path/to/script.phpand y está tratando de abrir un archivo llamado file.php en el mismo directorio, no puede usar una ruta relativa como fopen (file.php). El archivo debe invocarse desde su ruta absoluta, así: fopen (/path/to/file.php). Esto se debe a que los trabajos cron no se ejecutan necesariamente desde el directorio en el que se encuentra el script, por lo que todas las rutas se deben llamar específicamente.


Además, entiendo que quieres ejecutar esto cada minuto. Si es así, 1 * * * * no funcionará. Intead, se ejecutará cada 1 minuto pasado cada hora . Entonces, si quiere ejecutarlo cada minuto, diga * * * * * .

Es importante entender “shell de inicio de sesión” y “caparazón interactivo” lo que significan.

  • shell de inicio de sesión: se abre brevemente cuando inicia sesión con sesión ssh y obtiene una ventana de terminal donde puede ingresar comandos de shell. Después de iniciar sesión, el sistema ejecuta algunos archivos (.bashrc) y establece algunas variables de entorno, como la variable PATH para usted.
  • caparazón interactivo: después de iniciar sesión en un sistema, puede iniciar manualmente terminal (es) de shell. El sistema ejecuta algún archivo de perfil asignado a su cuenta (.bash_profile, .bash_login, .profile). Estos archivos también establecen algunas variables de entorno e inicializan la variable PATH para su sesión de shell abierta manualmente.

El sistema operativo comenzó scripts de shell y cron jobs no encaja en la forma mencionada anteriormente para iniciar un shell. Por lo tanto, no se ejecuta ninguna secuencia de comandos del sistema (.bashrc) o perfiles de usuario. Esto significa que nuestra variable PATH no está inicializada. Los comandos de Shell no se pudieron encontrar porque la variable PATH no apunta a los lugares correctos.

Esto explica por qué su secuencia de comandos se ejecuta correctamente si la inicia manualmente, pero falla al iniciarla a través de crontab.

Solución-1: utilice la ruta absoluta de cada comando de shell en lugar de solo el nombre de comando utilizado en los archivos de script.

  • en lugar de “awk” usa “/ usr / bin / awk”
  • en lugar de “sed” usa “/ bin / sed”

Solución-2: ¡ Inicialice las variables de entorno y especialmente la variable PATH antes de ejecutar scripts de shell!