Cómo hacer que CRON llame en las rutas correctas


Estoy tratando de hacer que cron llame a las rutas correctas. Cuando corro un script de Python desde el shell, el script funciona bien, ya que utiliza las rutas establecidas en bashrc, pero cuando uso cron, todas las rutas no se utilizan desde bashrc. ¿Hay un archivo en el que pueda introducir las rutas para cron como bashrc o una forma de llamar a las rutas desde bashrc?

Lo siento, no creo que haya redactado esto correctamente, puedo obtener el script correcto para ejecutar (lo que significa que la ruta al script en crontab no es el problema aquí), es justo cuando ese script se está ejecutando Corro una compilación y esta usa las rutas establecidas en .bashrc. Cuando corro el script cuando estoy conectado, las rutas .bashrc se extraen. Dado que cron no se ejecuta en un shell, por ejemplo, no tira de .bashrc. ¿Hay alguna forma de sacar esto sin tener que escribir un wrapper de script bash?

Author: Chris Martin, 2010-03-05

15 answers

Usé /etc/crontab. Usé vi e ingresé 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.

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
 135
Author: chrissygormley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-24 18:44:45

Lo más probable es que cron se esté ejecutando en un entorno muy escaso. Compruebe las variables de entorno que cron está utilizando añadiendo un trabajo ficticio que vuelca 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 parece similar a la respuesta de chrissygormley, con la ruta definida antes de las reglas de crontab.

 43
Author: joemaller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-22 00:56:14

Debes poner caminos completos en tu crontab. Es la opción más segura.
Si no desea hacer eso, puede poner un script de envoltura alrededor de sus programas, y establecer la RUTA allí.

Por ejemplo

01 01 * * * command

Se convierte en:

01 01 * * * /full/path/to/command

También cualquier llamada desde cron debe tener mucho cuidado con los programas que ejecuta, y probablemente establecer su propia elección para la variable PATH.

EDITAR:

Si no sabe dónde está el comando que desea ejecutar which <command> desde su shell y te dirá el camino.

EDIT2:

Así que 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 que el script se ejecute.
Básicamente, en lugar de pensar en cómo modificar el entorno cron para hacerlo más adecuado para su programa/script, haga que su script maneje el entorno que se le da, configurando uno apropiado cuando se inicia.

 20
Author: Douglas Leeder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-05 17:10:38

Haga que sus variables funcionen para usted, esto le permitirá acceder a t

Defina su RUTA en/etc/profile.d/*. sh

Variables de entorno de todo el sistema

Archivos con la extensión. sh en el perfil/etc/.d el directorio se ejecuta cada vez que se introduce un shell de inicio de sesión bash (por ejemplo, cuando se inicia sesión desde la consola o a través de 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:

export JAVA_HOME=/usr/lib/jvm/jdk1.7.0
export PATH=$PATH:$JAVA_HOME/bin

Ejecutar crontab con la opción de inicio de sesión!

CRONTAB ejecuta 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
 13
Author: Artistan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-03 11:37:14

Establecer la RUTA justo antes de la línea de comandos en mi crontab funcionó para mí:

* * * * * PATH=$PATH:/usr/local/bin:/path/to/some/thing
 13
Author: myrho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-23 11:01:23

Problema

Su script funciona cuando lo ejecuta desde la consola, pero falla en cron.

Causa

Su crontab no tiene las variables de ruta correctas (y posiblemente shell)

Solución

Añade tu shell actual y path 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

Https://github.com/ssstonebraker/braker-scripts/blob/master/working-scripts/add_current_shell_and_path_to_crontab.sh

Muestra Salida

add_curent_shell_and_path_to_crontab.sh ejemplo de salida

 9
Author: brakertech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-23 15:39:06

Agregar una definición de RUTA en el 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.

 8
Author: Treviño,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-30 15:53:51

El entorno predeterminado para los trabajos cron es muy escaso y puede ser muy diferente del entorno en el que desarrolla sus scripts python. Para un script que pueda ejecutarse en cron, cualquier entorno del que dependa debe configurarse explícitamente. En el propio archivo cron, incluya rutas completas a los ejecutables de python y a sus scripts de python.

 2
Author: mob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-05 16:12:07

En mi AIX cron recoge sus variables ambientales de /etc/environment ignorando lo que se establece en el .perfil.

Edit: También revisé un par de cajas de Linux de varias edades y parecen tener este archivo también, por lo que es probable que no sea específico de AIX.

He comprobado esto usando la sugerencia cron de joemaller y comprobando la salida antes y después de editar la variable PATH en /etc/environment.

 2
Author: Van Amburg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-18 20:02:34

Sé que esto ya ha sido contestado, pero pensé que el suyo 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 a esta pregunta:

  1. Asegúrese de que tiene las variables que necesita en PYTHONPATH (se encuentra aquí y aquí y para más información aquí) dentro de la .perfil o.bash_profile para cualquier shell en el que desee probar su script para asegurarse de que funciona.

  2. Editar su crontab para incluir los directorios necesarios para ejecutar su script en un trabajo cron (encontrado 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 ser capaz de encontrar la raíz o el directorio donde se almacena el ejecutable) y probablemente estos (/sbin:/bin:/usr/sbin:/usr/bin)

  3. 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á como lo siguiente:

    * * * * cd /Users/user/Documents/foo; bar -l doSomething -v 
    
 2
Author: derigible,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:03:02

Si no quieres tener que hacer las mismas ediciones en varios lugares, entonces aproximadamente haz esto:

* * * * * . /home/username/.bashrc && yourcommand all of your args

El. espacio y luego el camino a .bashrc y el comando && son la magia allí para obtener los cambios de su entorno 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:

SHELL=/bin/bash

Espero que ayude a alguien!

 1
Author: Wade Chandler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-22 16:41:45

@Trevino: tu respuesta me ayudó a resolver mi problema. Sin embargo, para un principiante, tratando de dar un enfoque paso a paso.

  1. Obtenga su instalación actual de java a través de $ echo $JAVA_HOME
  2. $ crontab -e
  3. * * * * * echo $PATH - esto le permite entender cuál es el valor de RUTA que está siendo utilizado por crontab en la actualidad. Ejecute crontab y grab value Valor de RUTA utilizado por crontab.
  4. Ahora edite crontab de nuevo para establecer la ruta de acceso 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 job / script like */10 * * * * sh runMyJob.sh &; d) remove echo $PATH from crontab as its not needed now.
 1
Author: Ram Dwivedi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-21 09:16:42

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

 0
Author: shiva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-02 19:46:28

La solución más simple que he encontrado se ve así:

* * * * * root su -l -c command

Este ejemplo invoca a su como usuario root e inicia el shell con el entorno completo del usuario, incluyendo PATH PATH, establecido como si estuviera conectado. Funciona igual en diferentes distribuciones, es más confiable que el abastecimiento .bashrc (que no ha funcionado para mí) y evita codificar rutas específicas, lo que puede ser un problema si proporciona un ejemplo o una herramienta de configuración y no sabe qué distribución o diseño de archivo en el sistema.

También puede especificar el nombre de usuario después de su si desea un usuario diferente a root, pero probablemente debería dejar el parámetro root antes del comando su ya que esto garantiza que su tenga suficientes privilegios para cambiar a cualquier usuario que especifique.

 0
Author: tasket,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-14 18:37:57

Si utilizas webmin estos son los pasos para establecer el valor 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
 -2
Author: Al Bundy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-18 10:51:19