linux - manualmente - Cómo hacer que CRON llame en los PATH correctos
ejecutar crontab manualmente (14)
Estoy tratando de hacer que cron llame los PATH correctos. Cuando ejecuto una secuencia de comandos de Python desde el shell, la secuencia de comandos funciona bien, ya que utiliza las rutas establecidas en bashrc, pero cuando uso cron, todas las rutas no se utilizan desde bashrc. ¿Hay algún archivo en el que pueda ingresar los PATH para cron como bashrc o una forma de llamar a los PATH desde bashrc?
Lo siento, no creo que haya redactado esto correctamente, puedo ejecutar la secuencia de comandos correcta (lo que significa que la RUTA de la secuencia de comandos en crontab no es el problema aquí), es justo cuando esa secuencia de comandos se ejecuta ejecuto una compilación y esto utiliza la PATHs establecidos en .bashrc
. Cuando ejecuto el script cuando estoy conectado, las rutas de acceso de .bashrc
activan. Dado que cron no se ejecuta en un shell por decir que no lo hace en .bashrc
. ¿Hay alguna manera de aprovechar esto sin tener que escribir un contenedor de script bash?
Problema
Tu script funciona cuando lo ejecutas 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
Script para hacerlo por ti
#!/bin/bash
#
# Date: August 22, 2013
# Author: Steve Stonebraker
# File: add_current_shell_and_path_to_crontab.sh
# Description: Add current user''s shell and path to crontab
# Source: http://brakertech.com/add-current-path-to-crontab
# Github: hhttps://github.com/ssstonebraker/braker-scripts/blob/master/working-scripts/add_current_shell_and_path_to_crontab.sh
# function that is called when the script exits (cleans up our tmp.cron file)
function finish { [ -e "tmp.cron" ] && rm tmp.cron; }
#whenver the script exits call the function "finish"
trap finish EXIT
########################################
# pretty printing functions
function print_status { echo -e "/x1B[01;34m[*]/x1B[0m $1"; }
function print_good { echo -e "/x1B[01;32m[*]/x1B[0m $1"; }
function print_error { echo -e "/x1B[01;31m[*]/x1B[0m $1"; }
function print_notification { echo -e "/x1B[01;33m[*]/x1B[0m $1"; }
function printline {
hr=-------------------------------------------------------------------------------------------------------------------------------
printf ''%s/n'' "${hr:0:${COLUMNS:-$(tput cols)}}"
}
####################################
# print message and exit program
function die { print_error "$1"; exit 1; }
####################################
# user must have at least one job in their crontab
function require_gt1_user_crontab_job {
crontab -l &> /dev/null
[ $? -ne 0 ] && die "Script requires you have at least one user crontab job!"
}
####################################
# Add current shell and path to user''s crontab
function add_shell_path_to_crontab {
#print info about what''s being added
print_notification "Current SHELL: ${SHELL}"
print_notification "Current PATH: ${PATH}"
#Add current shell and path to crontab
print_status "Adding current SHELL and PATH to crontab /nold crontab:"
printline; crontab -l; printline
#keep old comments but start new crontab file
crontab -l | grep "^#" > tmp.cron
#Add our current shell and path to the new crontab file
echo -e "SHELL=${SHELL}/nPATH=${PATH}/n" >> tmp.cron
#Add old crontab entries but ignore comments or any shell or path statements
crontab -l | grep -v "^#" | grep -v "SHELL" | grep -v "PATH" >> tmp.cron
#load up the new crontab we just created
crontab tmp.cron
#Display new crontab
print_good "New crontab:"
printline; crontab -l; printline
}
require_gt1_user_crontab_job
add_shell_path_to_crontab
Fuente
Muestra de salida
@Trevino: tu respuesta me ayudó a resolver mi problema. Sin embargo, para un principiante, intenta dar un enfoque paso a paso.
- Obtenga su instalación actual de java a través de
$ echo $JAVA_HOME
-
$ crontab -e
-
* * * * * echo $PATH
- esto te permite entender cuál es el valor PATH que está usando crontab en este momento. Ejecute crontab y obtenga el valor $ PATH utilizado por crontab. - Ahora edita crontab de nuevo para establecer tu ruta de bin de Java deseada: a)
crontab -e
; b)PATH=<value of $JAVA_HOME>/bin:/usr/bin:/bin
(es una ruta de ejemplo); c) ahora su trabajo / script programado como*/10 * * * * sh runMyJob.sh &
; d) eliminarecho $PATH
de crontab ya que no es necesario ahora.
Agregar una definición de PATH al crontab del usuario con los valores correctos ayudará ... He llenado el mío con solo:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Y es suficiente para que todos mis scripts funcionen ... Incluya cualquier ruta personalizada allí si es necesario.
Configurar PATH justo antes de la línea de comando en mi crontab funcionó para mí:
* * * * * PATH=$PATH:/usr/local/bin:/path/to/some/thing
Debes poner rutas completas en tu crontab
. Esa es la opción más segura.
Si no quiere hacer eso, puede colocar un script envoltorio alrededor de sus programas y establecer la RUTA allí.
p.ej
01 01 * * * command
se convierte en:
01 01 * * * /full/path/to/command
También cualquier cosa llamada desde cron
debe tener mucho cuidado con los programas que ejecuta, y probablemente establecer su propia opción para la variable PATH
.
EDITAR:
Si no sabe dónde está el comando, desea ejecutar which <command>
de su caparazón y le dirá 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 ejemplo, LD_LIBRARY_PATH
) a los valores que se requieren para ejecutar el script.
Básicamente, en lugar de pensar en cómo modificar el entorno cron para que sea más adecuado para su programa / script, haga que su secuencia de comandos maneje el entorno que le da, configurando uno apropiado cuando se inicie.
El entorno predeterminado para las tareas cron es muy escaso y puede ser muy diferente del entorno en el que desarrolla sus scripts Python. Para una secuencia de comandos que se puede ejecutar en cron, cualquier entorno del que dependa debe establecerse explícitamente. En el archivo cron en sí, incluya rutas completas a los ejecutables de Python y a sus scripts de Python.
En mi cron AIX veo sus variables ambientales de / etc / environment ignorando lo que está configurado en .profile.
Editar: También revisé un par de cajas de Linux de varias edades y estas parecen tener también este archivo, por lo que probablemente no sea específico de AIX.
Lo comprobé usando la sugerencia de cron de joemaller y comprobando el resultado antes y después de editar la variable PATH en / etc / environment.
Establece la RUTA requerida en tu cron
crontab -e
Editar: Presione i
PATH=/usr/local/bin:/usr/local/:or_whatever
10 * * * * your_command
Guardar y salir :wq
Haga que sus variables trabajen para usted, esto le permitirá acceder
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 de bash (por ejemplo, al iniciar sesión desde la consola o desde ssh), así como mediante 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:
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0
export PATH=$PATH:$JAVA_HOME/bin
¡Ejecute crontab con la opción de inicio de sesión!
CRONTAB ejecutar script o comando con variables de entorno
0 9 * * * cd /var/www/vhosts/foo/crons/; bash -l -c ''php -f ./download.php''
0 9 * * * cd /var/www/vhosts/foo/crons/; bash -l -c download.sh
Lo más probable es que cron se esté ejecutando en un entorno muy disperso. Comprueba las variables de entorno que utiliza cron al agregar un trabajo ficticio que volca env
a un archivo como este:
* * * * * env > env_dump.txt
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:
# echo PATH=$PATH > tmp.cron
# echo >> tmp.cron
# crontab -l >> tmp.cron
# crontab tmp.cron
El crontab resultante se verá similar a la respuesta de chrissygormley, con PATH definido antes de las reglas de crontab.
Sé que esto ya ha sido respondido, pero pensé que el suyo sería útil para algunos. Tuve un problema similar que resolví recientemente (se encuentra 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 de .profile o .bash_profile para cualquier shell en el que quiera probar el script para asegurarse de que funciona.
edite su crontab para incluir los directorios necesarios para ejecutar su script en un trabajo cron (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, necesita 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 con éxito el script antes (es decir, Users / user / Documents / foo)
a) Esto se verá así:
* * * * cd /Users/user/Documents/foo; bar -l doSomething -v
Si no desea tener que hacer las mismas ediciones en varios lugares, haga lo siguiente:
* * * * * . /home/username/.bashrc && yourcommand all of your args
Los . espacio y luego el camino a .bashrc y el comando && son la magia allí para obtener sus cambios de entorno en el shell bash en ejecución. Demasiado, si realmente quieres que el shell sea bash, es una buena idea tener una línea en tu crontab:
SHELL=/bin/bash
Espero que ayude a alguien!
Si utiliza webmin
, estos son los pasos de cómo configurar el valor de PATH
:
System
-> Scheduled Cron Jobs
-> Create a new environment variable
-> For user: <Select the user name>
-> Variable name: PATH
-> Value: /usr/bin:/bin:<your personal path>
-> Add environment variable: Before all Cron jobs for user
/etc/crontab
. Usé vi
e ingresé en las rutas que necesitaba en este archivo y lo ejecuté como root. El crontab normal sobrescribe las rutas que ha configurado. Un buen tutorial sobre cómo hacer esto es: http://unixhelp.ed.ac.uk/CGI/man-cgi?crontab+5 .
El archivo cron de todo el sistema se ve así:
This has the username field, as used by /etc/crontab.
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don''t have to run the `crontab''
# command to install the new version when you edit this file.
# This file also has a username field, 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 user command
42 6 * * * root run-parts --report /etc/cron.daily
47 6 * * 7 root run-parts --report /etc/cron.weekly
52 6 1 * * root run-parts --report /etc/cron.monthly
01 01 * * 1-5 root python /path/to/file.py