Estoy tratando de hacer que cron llame a las RUTA correctas. Cuando ejecuto un script de Python desde shell, el script funciona bien ya que usa las RUTA establecidas en bashrc pero cuando uso cron no todas las RUTA se usan desde bashrc. ¿Hay un archivo en el que pueda ingresar las RUTA para cron como bashrc o una forma de llamar a las RUTA desde bashrc?
Lo siento, no creo que haya redactado esto correctamente, puedo ejecutar el script correcto (lo que significa que la RUTA del script en crontab no es el problema aquí), es solo cuando ese script se está ejecutando, ejecuto una compilación y utiliza el CAMINOS establecidos .bashrc
. Cuando ejecuto el script cuando estoy conectado, las .bashrc
PATHs se activan. Dado que cron no se ejecuta en un shell por decirlo, no se activa .bashrc
. ¿Hay alguna manera de hacer esto sin tener que escribir un contenedor de script bash?
source /etc/profile
que debe comer.bashrc
y muchas otras cosas potencialmente faltantes para usted. El abastecimiento explícito de perfiles se vuelve bastante útil si desea que algunos scripts se ejecuten "de forma independiente", también protege de entornos extraños y, por lo tanto ...sh
scripts llamados por crontab funcionen. Puede confirmar que actualiza la ruta agregando un trabajo como* * * * * echo $PATH > ~/crontab_path.txt
y revisando el archivo después de un minuto.Respuestas:
He utilizado
/etc/crontab
. Solíavi
y entré en los caminos que necesitaba en este archivo y corriendo como root. El crontab normal sobrescribe las RUTA que ha configurado. Un buen tutorial sobre cómo hacer esto .El archivo cron de todo el sistema se ve así:
fuente
/etc/crontab
están disponibles para cron cuando se ejecuta como root en Ubuntu 14.04. (sudo crontab -e
)Lo más probable es que cron se ejecute en un entorno muy escaso. Verifique las variables de entorno que cron está utilizando agregando un trabajo ficticio que se vuelca
env
en un archivo como este:Compare eso con la salida de
env
en una sesión de shell normal.Puede anteponer sus propias variables de entorno al crontab local definiéndolas en la parte superior de su crontab.
Aquí hay una solución rápida para anteponer
$PATH
al crontab actual:El crontab resultante se verá similar a la respuesta de chrissygormley, con PATH definido antes de las reglas de crontab.
fuente
Debes poner caminos completos en tu
crontab
. Esa es la opción más segura.Si no desea hacerlo, puede colocar un script de envoltura alrededor de sus programas y establecer la RUTA allí.
p.ej
se convierte en:
Además, todo lo que se llame
cron
debe tener mucho cuidado con los programas que ejecuta, y probablemente establecer su propia elección para laPATH
variable.EDITAR:
Si no sabe dónde está el comando que desea ejecutar
which <command>
desde su shell y le indicará la ruta.EDIT2:
Entonces, una vez que su programa se está ejecutando, lo primero que debe hacer es establecer
PATH
y cualquier otra variable requerida (por ejemploLD_LIBRARY_PATH
) a los valores que se requieren para que se ejecute el script.Básicamente, en lugar de pensar cómo modificar el entorno cron para que sea más adecuado para su programa / secuencia de comandos, haga que su secuencia de comandos maneje el entorno que se le proporciona, configurando uno apropiado cuando se inicie.
fuente
crontab
.Establecer PATH justo antes de la línea de comando en mi crontab funcionó para mí:
fuente
Agregar una definición de RUTA en el crontab de usuario con los valores correctos ayudará ... He llenado el mío con solo:
Y es suficiente para que todos mis scripts funcionen ... Incluya cualquier ruta personalizada allí si es necesario.
fuente
/etc/crontab
. Esta es la respuesta más fácil a nivel de usuario. Buen trabajo @ Treviño. Vota esto si estás de acuerdo.Haga que sus variables trabajen para usted, esto permitirá el acceso t
Defina su RUTA en /etc/profile.d/*.sh
Variables de entorno de todo el sistema
Los archivos con la extensión .sh en el directorio /etc/profile.d se ejecutan cada vez que se ingresa un shell de inicio de sesión bash (por ejemplo, al iniciar sesión desde la consola o sobre ssh), así como por el DisplayManager cuando se carga la sesión de escritorio.
Por ejemplo, puede crear el archivo /etc/profile.d/myenvvars.sh y establecer variables como esta:
¡Ejecute crontab con la opción de inicio de sesión!
CRONTAB ejecuta script o comando con variables de entorno
fuente
Problema
Su script funciona cuando lo ejecuta desde la consola, pero falla en cron.
Porque
Su crontab no tiene las variables de ruta correctas (y posiblemente shell)
Solución
Agregue su shell y ruta actual al crontab
Guión para hacerlo por ti
Fuente
https://github.com/ssstonebraker/braker-scripts/blob/master/working-scripts/add_current_shell_and_path_to_crontab.sh
Salida de muestra
fuente
En mi cron AIX recoge sus variables ambientales de / etc / environment ignorando lo que se establece en el .profile.
Editar: También revisé un par de cuadros de Linux de varias edades y parece que también tienen este archivo, por lo que probablemente no sea específico de AIX.
Lo comprobé utilizando la sugerencia cron de joemaller y comprobando la salida antes y después de editar la variable PATH en / etc / environment.
fuente
Si no desea tener que hacer las mismas ediciones en varios lugares, haga esto aproximadamente:
Los . espacio y luego la ruta a .bashrc y el comando && son la magia para lograr que los cambios de su entorno se ejecuten en el shell bash en ejecución. También, si realmente quieres que el shell sea bash, es una buena idea tener una línea en tu crontab:
Espero que ayude a alguien!
fuente
El entorno predeterminado para los trabajos cron es muy escaso y puede ser muy diferente del entorno en el que desarrolla sus scripts de Python. Para un script que pueda ejecutarse en cron, cualquier entorno del que dependa debe establecerse explícitamente. En el propio archivo cron, incluya rutas completas a los ejecutables de Python y a sus scripts de Python.
fuente
Sé que esto ya ha sido respondido, pero pensé que sería útil para algunos. Tuve un problema similar que resolví recientemente ( encontrado aquí ) y aquí están los aspectos más destacados de los pasos que tomé para responder esta pregunta:
asegúrese de tener las variables que necesita en PYTHONPATH (que se encuentra aquí y aquí y para obtener más información aquí) dentro del .profile o .bash_profile para cualquier shell en el que desee probar su script para asegurarse de que funciona.
edite su crontab para incluir los directorios necesarios para ejecutar su script en un trabajo cron (que se encuentra aquí y aquí)
a) asegúrese de incluir el directorio raíz en la variable PATH (.) como se explica aquí (básicamente, si está ejecutando un ejecutable con su comando, debe poder encontrar la raíz o el directorio donde está almacenado el ejecutable) y probablemente estos (/ sbin: / bin: / usr / sbin: / usr / bin)
en su archivo crontab, cree un cronjob que cambiará el directorio al directorio donde ha ejecutado correctamente el script antes (es decir, Usuarios / usuario / Documentos / foo)
a) Esto se verá así:
fuente
@Trevino: tu respuesta me ayudó a resolver mi problema. Sin embargo, para un principiante, tratar de dar un enfoque paso a paso.
$ echo $JAVA_HOME
$ crontab -e
* * * * * echo $PATH
- esto le permite comprender cuál es el valor de RUTA que está utilizando crontab en la actualidad. Ejecute crontab y tome el valor $ PATH utilizado por crontab.crontab -e
; b)PATH=<value of $JAVA_HOME>/bin:/usr/bin:/bin
(es una ruta de muestra); c) ahora su trabajo / script programado como*/10 * * * * sh runMyJob.sh &
; d) eliminarecho $PATH
de crontab ya que no es necesario ahora.fuente
Establezca la RUTA requerida en su cron
Editar: Presione
i
Guardar y Salir
:wq
fuente
La solución más simple que he encontrado se ve así:
Este ejemplo se invoca
su
como usuario root e inicia el shell con el entorno completo del usuario, incluido $ PATH, configurado como si estuvieran conectados. Funciona igual en diferentes distribuciones, es más confiable que el abastecimiento de .bashrc (que no ha funcionado para yo) y evita codificar rutas específicas que pueden ser un problema si proporciona un ejemplo o una herramienta de configuración y no sabe qué distribución o distribución de archivos tiene el sistema del usuario.También puede especificar el nombre de usuario después
su
si desea un usuario diferente al root, pero probablemente debería dejar elroot
parámetro antes delsu
comando ya que esto garantiza quesu
tenga los privilegios suficientes para cambiar a cualquier usuario que especifique.fuente
En caso de que utilice
webmin
, estos son los pasos para configurar elPATH
valor:fuente