linux - crontab PATH y USUARIO
crontab file location (5)
Soy nuevo en la programación de tareas con cron y crontab. Estoy intentando programar la ejecución de una tarea como si hubiera iniciado sesión, abriera un terminal y lo ejecutara yo mismo.
Sin embargo, programé una tarea para ayudarme a observar con qué $ USER y $ PATH se está ejecutando una tarea programada, 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 como si $ USER no está establecido, y $ PATH es algo muy básico y / o predeterminado. Por el contrario, esto es lo que veo cuando abro una terminal (iniciada sesión) y hago eco de 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 mis tareas crontab se ejecuten como deseo?
De acuerdo con "man 5 crontab" puede establecer variables de entorno en su crontab, escribiéndolas antes de sus líneas cron.
También hay un ejemplo de un crontab, así que solo tienes 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
# m h 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 )
Para que pueda ajustar su PATH o cualquier variable de entorno a lo que desee. Pero este ejemplo parece suficiente para casos típicos.
En * ix, los procesos comúnmente heredan un entorno de su proceso padre en fork + exec. Tienen la opción de limpiar el medio ambiente, pero generalmente no lo hacen. Puede ver el árbol de procesos con ps axf, y puede ver las variables de entorno utilizando ps axfe.
Por lo general, cron no es un hijo del shell de alguien, por lo que a menudo tendrá un entorno diferente al de tu shell interactivo. Sin embargo, hay una buena posibilidad de que Crons esté limpiando intencionalmente su propio entorno para mantener la coherencia.
Me gusta probar mis trabajos cron ("foo" por el bien de la discusión) con lo siguiente en una shell interactiva: env - ./foo Esto borrará más env vars que cron, pero hace que sea más fácil obtener cosas va IMO, ya que lo que estás probando es más similar. Necesitará establecer cualquier variable de la que dependa (como $ PATH), o reemplazarla con otra cosa: EG $ USER se convierte en $ (whoami).
También me gusta escribir mis scripts de 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 no definida", y el pipefail dice "no devolver el último código de salida en una canalización, sino que devolver el primer código de salida que no sea cero en una tubería" . En su caso, el conjunto -u puede ser particularmente útil.
En nuestro entorno, normalmente no tenemos este problema ya que la raíz es el único cron permitido y cada comando se ejecuta normalmente como un usuario específico de la aplicación VIA un comando su -c como:
su - myuser -c "/usr/local/scripts/app.sh" 2>&1
ya que la opción "-" está especificada, obtenemos el perfil y el entorno de myuser. Recientemente tuvimos un problema con un comando que necesitaba la autorización de la raíz para completarse con éxito, por lo que acabamos de emitir el comando sin la su -c Después de una cierta cantidad de investigación, nos dimos cuenta de que la forma más sencilla de obtener el entorno de root es utilizar la misma técnica para root que todas las demás aplicaciones, por lo que emitimos:
su - root -c "/usr/local/scripts/app.sh" 2>&1
Recuerde que crontab es un demonio o servicio, por lo que no es como un usuario que inició sesión o algo así. Si desea tener sus variables de entorno, deberá configurarlas usted mismo. Sin embargo, la mayoría de estas variables las establece el shell desde la ruta / etc / profile y luego ingresan a sus variables personalizadas en su directorio $ HOME.
Es posible que pueda configurar algunos de ellos al "abastecer" su / etc / profile como:
41 11 * * * /home/<me>/cron_env.sh
Donde cron_env.sh
contendrá algo como:
#!/bin/sh source /etc/profile /usr/bin/env > /home/<me>/cron_env.log
crontab no es un script de bash, no puede usar variables de entorno que normalmente están disponibles en un shell.
Intente mover todo ese código a un archivo de script de shebang''ed (uno que comienza con la línea "#! / Bin / bash") y ejecute ese script en el crontab.
No estoy seguro, pero creo que PATH (y quizás CORREO ELECTRÓNICO si lo configuras) puede ser el único al que puedes acceder dentro del archivo crontab.
EDITAR: Verifique la página del manual de crontab 5 , hay bastantes variables de entorno disponibles, todas configuradas por el demonio cron.