157 votes

Comment faire en sorte que CRON appelle dans les chemins corrects

Je vais essayer d'obtenir cron pour appeler dans le bon chemin. Lorsque j'exécute un script Python dans la coquille de l'exécution de script est très bien comme il utilise le chemin d'accès est défini dans bashrc mais quand j'utilise cron tous les le chemin d'accès ne sont pas utilisés à partir bashrc. Est-il un fichier que je peux entrer le chemin d'accès dans de cron comme bashrc ou un moyen d'appeler le chemin de bashrc.

Désolé, je ne pense pas que j'ai rédigé cet correctement, je peux obtenir le bon script à exécuter (ce qui signifie le chemin vers le script dans la crontab n'est pas le problème ici), c'est juste quand le script est en cours d'exécution, je lance un build et il utilise le CHEMIN d'accès est défini en .bashrc. Lorsque je lance le script quand je suis connecté, l' .bashrc du chemin sont tiré dans. Depuis cron ne fonctionne pas dans un shell par dire qu'il ne faut pas tirer en .bashrc. Donc, il y a un moyen de tirer ce sans avoir à écrire un script bash wrapper?

Merci

217voto

chrissygormley Points 3568

J'ai utilisé /etc/crontab . J'ai utilisé vi et entré le PATH dont j'avais besoin dans ce fichier et l'exécutant en tant que root. La crontab normale écrase les chemins PATH que vous avez configurés. Un bon tutoriel sur la procédure à suivre est le suivant: http://unixhelp.ed.ac.uk/CGI/man-cgi?crontab+5 .

Le fichier cron à l'échelle du système ressemble à ceci:

        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
 

56voto

joemaller Points 2349

Le plus probable, cron est en cours d'exécution dans une très clairsemée environnement. Vérifier les variables d'environnement à l'aide de cron est en ajoutant un mannequin d'emploi qui décharges env d'un fichier comme ceci:

* * * * * env > env_dump.txt

Comparez cela avec la sortie de l' env dans des conditions normales session shell.

Vous pouvez ajouter vos propres variables d'environnement locales crontab en les définissant à la partie supérieure de votre crontab.

Voici une solution rapide à faire précéder $PATH pour l'actuel crontab:

# echo PATH=$PATH > tmp.cron
# echo >> tmp.cron
# crontab -l >> tmp.cron
# crontab tmp.cron

Le résultant crontab ressemble à chrissygormley réponse, avec CHEMIN d'accès défini avant la crontab règles.

26voto

Douglas Leeder Points 29986

Vous devriez mettre plein les chemins d'accès dans votre crontab. C'est l'option la plus sûre.
Si vous ne voulez pas faire, que vous pouvez mettre un script de lancement autour de vos programmes, et de définir le CHEMIN là-dedans.

par exemple

01 01 * * * command

devient:

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

Aussi quelque chose appelé à partir d' cron devrait être très prudent sur les programmes qu'il exécute, et probablement ses propres choix pour l' PATH variable.

EDIT:

Si vous ne savez pas où la commande que vous souhaitez exécuter which <command> de votre coquille et il va vous indiquer le chemin.

EDIT2:

Donc, une fois que votre programme est en cours d'exécution, la première chose à faire est de définir PATH et tout autre variable (par exemple, LD_LIBRARY_PATH) pour les valeurs qui sont nécessaires pour exécuter le script.
Fondamentalement, au lieu de penser comment modifier le cron de l'environnement pour le rendre plus adapté pour votre programme/script - faire à votre script de gérer l'environnement qu'il est donné, par un réglage approprié lorsqu'il démarre.

22voto

Treviño Points 377

Ajouter une définition de PATH dans la crontab de l'utilisateur avec les valeurs correctes aidera ... J'ai rempli la mienne avec juste:

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

Et cela suffit pour que tous mes scripts fonctionnent ... Incluez un chemin personnalisé là-bas si vous en avez besoin.

11voto

brakertech Points 426

Problème

Votre script fonctionne lorsque vous l'exécutez à partir de la console, mais échoue dans cron.

Cause

Votre crontab n'a pas le droit variables de chemin d'accès (et, éventuellement, shell)

Solution

Ajouter votre shell courant et le chemin de la crontab

Script pour le faire pour vous

#!/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

Source

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

Exemple De Sortie

add_curent_shell_and_path_to_crontab.sh example output

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X