ejecutando un script sh del cron

Tengo un script test.sh

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

cuando ejecuto el file como root desde la command-line, funciona.

 sh /home/v/test.sh 

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

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

¿Qué hago mal? Gracias

De acuerdo con el hombre:

El cron daemon inicia una subshell desde su directory HOME. Si progtwig un command para ejecutar cuando no está conectado y desea que se ejecuten los commands en su file .profile, el command debe leer explícitamente su file .profile.

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

Así que cron daemon no sabe dónde está php y usted debe especificar la ruta completa de php a mano, por ejemplo (no conozco su ruta real de PHP):

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

Otra forma es get 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, PATH)

EDITAR

Una lectura interesante es " Newbie: introducción a cron ", no infravalores 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 directorys que estarán en la ruta de búsqueda de cron. Por ejemplo, si tiene un progtwig 'foo' en el directory / usr / cog / bin, podría valer la pena agregar / usr / cog / bin a la ruta, como le impedirá tener que utilizar la ruta completa a 'foo' cada vez que quiera llamarlo.

Hay cuatro causas comunes para que los commands funcionen cuando se escriben en un terminal pero no desde cron, en order de lo común:

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

Si su trabajo produce algún resultado, incluidos los posts de error, cron le envía un correo electrónico con toda la información. Asegúrese de leer el correo que recibe localmente o reenvíelo a una dirección que lea. Para reenviar correos desde una count local a otra dirección, ponga la otra dirección en ~/.forward . Si el trabajo cron se está ejecutando como un usuario del sistema ( root , webmaster , …), asegúrese de que el correo del usuario sea networkingirigido a usted (y a cualquier otro administrador); con la mayoría de las configuraciones de correo, ponga líneas como root: elzo en /etc/aliases .

El cron daemon por lo general ejecuta su command en un shell donde la variable de entorno PATH está restringida a algunos valores pnetworkingeterminados del sistema, por ejemplo, / usr / bin: / bin.

Probablemente, su command php no está disponible en / usr / bin o / bin y, por lo tanto, la secuencia de commands falla cuando se ejecuta a través de cron y se ejecuta correctamente cuando no.

Cron generalmente informa errores o posts de trabajo a través de un correo al usuario raíz (es decir, cuando un command devuelve un estado de salida! = 0 o produce 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 posts.