Friday, October 19, 2012

Bash Scripts no corren en crontab pero si manualmente desde el Command Line.

Pues llevo desde las 8 de la mañana tratando de decifrar porque unos scripts corren bien desde el command line pero dan error desde el crontab.

Primero verifica que el script tenga permisos de ejecución. Si los tiene puede que sea lo siguiente.

Los scripts que se ejecutan desde el crontab corren en un subshell que NO hereda los valores de tus environmental variables. Lo que significa que la variable $PATH de ese subshell solamente mira a "/usr/bin:/bin:" por lo que si estas corriendo una aplicación que depende del path de java (como en mi caso) nunca va a ejecutarse.

Esto se corrige de la siguiente manera.

1. Desde el command line buscamos el valor de la variable $PATH
# echo $PATH
PATH=/usr/lib64/qt-3.3/bin:/usr/NX/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/bin/java
2. Ahora editamos el crontab, copiamos el valor de la variable PATH y lo pegamos en la primera linea.

[root@server test]# crontab -e
PATH=/usr/lib64/qt-3.3/bin:/usr/NX/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/bin/java

#Automatic Jobs
34 10 * * * /opt/Test.sh > /opt/Job.log
01 4 * * * /opt/Test2.sh > /opt/Test.log
De esta manera nos estamos asegurando que todos los cronjobs que se corran tengan el $PATH definido.

Ya terminamos, guarda el archivo y ya está! Haz una prueba!