crontab PATH y USER

Soy nuevo en la progtwigción de tareas con cron y crontab. Estoy intentando progtwigr la ejecución de una tarea como si hubiera iniciado sesión, haya abierto una terminal y la haya ejecutado yo mismo.

Sin embargo, programé una tarea para ayudarme a observar con qué $ USER y $ PATH se está ejecutando una tarea progtwigda, y esto es lo que encontré:

$ crontab -l 41 11 * * * echo "USER: $USER" > ~/Desktop/cron_env.log; echo "PATH: $PATH" >> ~/Desktop/cron_env.log $ cat ~/Desktop/cron_env.log USER: PATH: /usr/bin:/bin 

Parece que $ USER no está configurado, y $ PATH es algo muy básico y / o predeterminado. Por el contrario, esto es lo que veo cuando abro un terminal (conectado) y echo esta misma información:

 USER: aschirma PATH: /usr/lib/jvm/java-6-sun/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/pkg/icetools/bin:/pkg/hwtools/bin:/pkg/netscape/bin:/pkg/gnu/bin 

¿Qué debo hacer para que las tareas de crontab se ejecuten como yo quiero?

De acuerdo con “man 5 crontab” puede establecer variables de entorno en su crontab, escribiéndolas antes de sus cron líneas.

También hay un ejemplo de un crontab, así que solo tiene que copiarlo / pegarlo:

 $ man 5 crontab | grep -C5 PATH | tail # and files in /etc/cron.d. These files also have username fields, # that none of the other crontabs do. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # mh dom mon dow usercommand 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 

Entonces puedes ajustar tu RUTA o cualquier variable de entorno a lo que quieras. Pero este ejemplo parece suficiente para casos típicos.

En * ix, los procesos suelen heredar un entorno de su proceso principal en fork + exec. Tienen la opción de limpiar el medio ambiente, pero por lo general no lo hacen. Puede ver el árbol de procesos con ps axf, y puede ver las variables de entorno utilizando ps axfe.

cron normalmente no es un elemento secundario del shell de alguien, por lo que a menudo tendrá un entorno diferente al de su caparazón interactivo. Sin embargo, hay una buena probabilidad de que cron vaya a limpiar intencionalmente su propio entorno de alguna manera por consistencia.

Me gusta probar mis trabajos cron (“foo” por el bien de la discusión) con lo siguiente en un intérprete interactivo: env – ./foo Esto eliminará más envás que cron, pero hace que sea más fácil obtener cosas ir a la OMI, ya que lo que estás probando es más similar. Tendrá que establecer las variables de las que depende (como $ PATH) o reemplazarlas por otra cosa: EG $ USER se convierte en $ (whoami).

También me gusta escribir mis scripts bash para usar “set -eu” y “set -o pipefail”. El -eu dice “salir en un código de salida distinto de cero, y salir en una referencia de variable indefinida”, y el error dice “no devuelve el último código de salida en una tubería, en su lugar devuelve el primer código de salida que no es cero en una tubería” . En su caso, el conjunto -u podría ser particularmente útil.

Recuerde que crontab es un daemon o servicio, por lo que no es como un usuario conectado o algo así. Si desea tener sus variables de entorno, tendrá que configurarlas usted mismo. Sin embargo, la mayoría de estas variables las establece el intérprete de comandos de la ruta / etc / profile y luego ingresa las variables personalizadas en el directorio $ HOME.

Puede establecer algunos de ellos “obteniendo” su / etc / profile como:

 41 11 * * * /home//cron_env.sh

Donde cron_env.sh contendrá algo así como:

 #! / bin / sh
 fuente / etc / perfil
 / usr / bin / env> /home//cron_env.log

En nuestro entorno, normalmente no tenemos este problema, ya que root es el único cron permitido y cada comando normalmente se ejecuta como un usuario específico de la aplicación VÍA un comando su -c como:

 su - myuser -c "/usr/local/scripts/app.sh" 2>&1 

como se especifica la opción “-” obtenemos el perfil y el entorno de mi usuario. Recientemente tuvimos un problema con un comando que necesitaba autorización de root para completarse con éxito, por lo que acabamos de emitir el comando sin el su-c. Después de una cierta cantidad de investigación, nos dimos cuenta de que la forma más fácil de obtener el entorno de root es usar la misma técnica para root que para todas las demás aplicaciones, así que emitimos:

 su - root -c "/usr/local/scripts/app.sh" 2>&1 

crontab no es un script bash, no puede usar variables de entorno que normalmente están disponibles en un shell.

Intente mover todo ese código en un archivo de script shebang’ed (uno que comience con la línea “#! / Bin / bash”) y ejecute ese script en el crontab.

No estoy seguro, pero creo que PATH (y tal vez EMAIL si lo configura) puede ser el único al que puede acceder dentro del archivo crontab.

EDITAR: Verifique la página de manual de crontab 5 , hay bastantes variables de entorno aviables, todo configurado por el daemon cron.