ejecutando un script sh desde el cron

12

Tengo un script test.sh

#!/bin/sh
php /home/v/file.php
sh /root/x/some.sh

cuando ejecuto el archivo como root desde la línea de comandos funciona.

sh /home/v/test.sh 

cuando lo configuro en crontab -e (es el cron raíz), no funciona

 * * * * * sh /home/v/test.sh

¿Qué hago mal? Gracias

Elzo Valugi
fuente
"no funciona" no funciona. ¿Ver? No sabes a qué me refiero, y al igual que no sabemos a qué te refieres. Quiero decir (sí) ¿qué no funciona? Podría ser sobre cualquier cosa. Podría ser una suposición correcta, pero es solo una suposición (y creo que es bastante buena, pero aún así).
Jürgen A. Erhard
Sí, si puede ser más específico con los resultados que está viendo, estaremos en mejores condiciones para determinar cuál es el problema. Es decir, ¿qué quieres decir con "no funciona" (:
gabe.
No veo ningún registro en el syslog, y los scripts están haciendo algunas inserciones en un db que no están sucediendo, y suceden si ejecuto el script a mano.
Elzo Valugi

Respuestas:

15

Según el hombre:

El demonio cron inicia una subshell desde su directorio HOME. Si programa que se ejecute un comando cuando no está conectado y desea que se ejecuten comandos en su archivo .profile, el comando debe leer explícitamente su archivo .profile.

El demonio cron proporciona un entorno predeterminado para cada shell, definiendo HOME, LOGNAME, SHELL (= / usr / bin / sh)
y PATH (= / usr / bin).

Entonces, cron daemon no sabe dónde está php y debe especificar la ruta de php completa a mano, por ejemplo (no sé su ruta de PHP real):

#!/bin/sh
/usr/local/bin/php /home/v/file.php
sh /root/x/some.sh

Otra forma es obtener el / etc / profile (o su .profile / .bashrc), por ejemplo

* * * * * . /home/v/.bashrc ; sh /home/v/test.sh

Esto es útil si su .bashrc establece las variables de entorno que necesita (es decir, RUTA)

EDITAR

Una lectura interesante es " Newbie: Intro to cron ", no subestimes el artículo del título (es una lectura para todos), de hecho está bien escrito y responde perfectamente a tu pregunta:

...
PATH contiene los directorios que estarán en la ruta de búsqueda de cron, por ejemplo, si tiene un programa 'foo' en el directorio / usr / cog / bin, podría valer la pena agregar / usr / cog / bin al ruta, ya que evitará que tengas que usar la ruta completa para 'engañar' cada vez que quieras llamarlo.
...

tmow
fuente
Bad $ PATH es la causa más común de scripts que funcionan a mano, pero no de cron.
Patrick
@Patrick Por supuesto, es un problema si cron no sabe dónde está php, de lo contrario, el crontab de Elzo funcionaría sin problemas, DEBE ser un problema de RUTA.
hasta
Muchas gracias por tu respuesta. Funcionó para mí muy fácilmente !!! .. Muchas gracias @tmow.
Vignesh Prajapati
5

Hay cuatro causas comunes para que los comandos funcionen cuando se escriben en una terminal pero no desde cron, en orden de comunidad:

  1. Cron proporciona un entorno limitado, por ejemplo, un mínimo $PATH, y faltan otras variables esperadas.
  2. Cron invoca / bin / sh de forma predeterminada, mientras que puede estar utilizando algún otro shell de forma interactiva.
  3. Cron trata el carácter% especialmente (se convierte en una nueva línea en el comando).
  4. Cron no proporciona un terminal o entorno gráfico.

Si su trabajo produce algún resultado, incluidos mensajes de error, cron le envía un correo electrónico con todo el resultado. Asegúrese de leer el correo que recibe localmente o reenvíelo a una dirección que leyó. Para reenviar el correo de una cuenta local a otra dirección, ingrese la otra dirección ~/.forward. Si el trabajo de cron se ejecuta como un usuario del sistema ( root, webmaster, ...), asegúrese de que el correo del usuario es redirigido a usted (y cualquier otro administrador); con la mayoría de las configuraciones de correo, coloque líneas como root: elzoen /etc/aliases.

Gilles 'SO- deja de ser malvado'
fuente
2

El demonio cron generalmente ejecuta su comando en un shell donde la variable de entorno PATH está restringida a algunos valores predeterminados del sistema, por ejemplo / usr / bin: / bin.

Probablemente, su phpcomando no está disponible en / usr / bin o / bin y, por lo tanto, el script falla cuando se ejecuta a través de cron y se ejecuta correctamente cuando no.

Cron generalmente informa errores o mensajes de trabajo por correo electrónico al usuario raíz (es decir, cuando un comando devuelve un estado de salida! = 0 o produce una salida a stdout / stderr) después de que el trabajo finaliza.

Dependiendo de su sistema, debe configurar la entrega de correo local para recibir estos mensajes.

maxschlepzig
fuente