Cómo configurar la variable de ruta crontab

17

Tuve un problema al ejecutar un script desde crontab. Después de investigar un poco, entendí que el problema se debía a que el parámetro PATH no incluye / sbin.

Miré lo que incluye en / etc / crontab:

PATH=/sbin:/bin:/usr/sbin:/usr/bin

Como prueba: trabajo cron simple para imprimir la variable PATH:

* * * * * echo $PATH &> /root/TMP.log

la salida es:

cat /root/TMP.log
/usr/bin:/bin

No entiendo este comportamiento ... ¿Cómo configuro la variable PATH ...? O mejor: ¿cómo agregarle rutas?

csny
fuente

Respuestas:

17

Si bien son similares, un crontab de usuario (editado usando crontab -e) es diferente y mantiene una ruta separada del crontab del sistema (editado editando / etc / crontab).

El crontab del sistema tiene 7 campos, insertando un nombre de usuario antes del comando. El crontab del usuario, por otro lado, tiene solo 6 campos, que van directamente al comando inmediatamente después de los campos de tiempo.

Del mismo modo, la RUTA en el crontab del sistema normalmente incluye los directorios / sbin, mientras que la RUTA en el crontab del usuario no. Si desea establecer PATH para el crontab de usuario, debe definir la variable PATH en el crontab de usuario.


Una solución simple para agregar su ruta regular en los comandos de shell en cron es hacer que el cronjob obtenga su perfil ejecutando bash en un shell de inicio de sesión. por ejemplo en lugar de

* * * * * some command

En su lugar, puedes correr

* * * * * bash -lc some command

De esa manera, si su perfil establece la RUTA u otras variables de entorno en algo especial, también se incluye en su comando.

madumlao
fuente
Gracias, eso lo explica ... Pero de esta manera solo puedo configurar la RUTA, y no editar, porque RUTA = / sbin: $ RUTA o similar no funciona. Intenté ...
csny
Sí, necesitaría definir la RUTA desde cero en un caso como este, lo que debería ser bastante fácil, ya que conoce todos los comandos que se ejecutan en su crontab, por lo que solo debe tenerlos en cuenta.
frijoles
@madumlao bash -lcno ayuda. Estoy bien por ahora con la configuración de PATH manualmente, pero si instalo algunos scripts, quiero que sean reconocidos en cronjobs sin especificar rutas completas. Estoy seguro de que es posible de alguna manera, y bash -lcestá en camino a una solución :)
csny
44
bash -lc inicia un shell de inicio de sesión que genera el perfil de su usuario. Esto significa que usa el PATH establecido en ~ / .bash_profile, ~ / .profile o ~ / .bashrc ... ¿tiene la ruta configurada allí? Si es así y funciona mal, actualice mi respuesta para ello
madumlao
Excelente. Gracias Madunlao Después de agregar manualmente la carpeta del archivo bin a ~ / .bash_profile, mi cronjob funciona bien.
张健健
8

Si necesita las RUTA predeterminadas de todo el sistema y otras variables ENV (que se definen en /etc/profile.d), simplemente coloque lo siguiente:

* * * * * . /etc/profile; your cmd
Vladislav Savchuk
fuente
3

Es posible establecer la RUTA (u otros parámetros) en la línea cronjob o en una sola línea. Pero no puede utilizar la expansión de shell como PATH=$PATH:/usr/local/bin. Pero la tilde está permitida para los accesos directos del directorio de inicio.

De los libros:

Una línea activa en un crontab es una configuración de entorno o un comando cron. La configuración de un entorno tiene la forma: nombre = valor donde los espacios en blanco alrededor del signo de igual (=) son opcionales, y cualquier espacio en blanco no líder posterior en el valor es parte del valor asignado al nombre. La cadena de valor se puede colocar entre comillas (simple o doble, pero coincidente) para preservar los espacios en blanco iniciales o finales.

Ver man 5 crontabpara más información.

Entonces esto debería funcionar:

PATH=/bin:/usr/bin:/my/path/bin
5 3 * * * command_that_requires_my_path
itsafire
fuente
0

Tuve el mismo problema y encontré otra forma de ejecutar mi script en crontab. Creo que la forma más fácil de ejecutar su programa es crear un script que pueda cd en el directorio de su programa. Luego llame a su programa en ese script.

Este es un ejemplo de un script (nombre del script = launcher.sh):

#!bin/bash
cd /home/pi/test
sudo python3 example.py

luego, haga que su script sea ejecutable:

chmod 755 launcher.sh

Y por último, agrega tu script a crontab

crontab -e

y agrega esta línea al final:

@reboot sh /home/pi/test/launcher.sh

(Configuré el programa para que se ejecute en cada reinicio)

Reyhaneh Trb
fuente