[linux] CRON이 올바른 PATH를 호출하도록하는 방법

cron이 올바른 PATH를 호출하도록하려고합니다. 쉘에서 Python 스크립트를 실행하면 bashrc에 설정된 PATH를 사용하므로 스크립트가 잘 실행되지만 cron을 사용할 때 모든 PATH는 bashrc에서 사용되지 않습니다. bashrc와 같은 cron에 대한 PATH를 입력 할 수있는 파일이나 bashrc에서 PATH를 호출하는 방법이 있습니까?

죄송합니다. 내가 올바르게 말한 것 같지 않습니다. 올바른 스크립트를 실행할 수 있습니다 (크론 탭의 스크립트에 대한 PATH가 여기서 문제가되지 않음을 의미합니다). 그 스크립트가 실행 중일 때 빌드를 실행하고 이것은 경로의 설정 .bashrc. 로그인 할 때 스크립트를 실행하면 .bashrcPATH가 풀인됩니다 .bashrc. cron은 쉘에서 실행되지 않기 때문에 . bash 스크립트 래퍼를 작성할 필요없이 이것을 끌어 오는 방법이 있습니까?



답변

나는 /etc/crontab. vi이 파일에 필요한 PATH를 사용 하고 입력하고 루트로 실행했습니다. 일반 crontab은 설정 한 PATH를 덮어 씁니다. 이를 수행하는 방법에 대한 좋은 자습서 .

시스템 전체 cron 파일은 다음과 같습니다.

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


답변

대부분의 경우 cron은 매우 드문 환경에서 실행됩니다. 다음 env과 같이 파일에 덤프하는 더미 작업을 추가하여 cron이 사용하는 환경 변수를 확인하십시오 .

* * * * * env > env_dump.txt

env일반 쉘 세션 의 출력과 비교하십시오 .

crontab 상단에서 정의하여 자신의 환경 변수를 로컬 crontab 앞에 추가 할 수 있습니다.

다음 $PATH은 현재 crontab 앞에 추가하는 빠른 수정입니다 .

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

결과 crontab은 chrissygormley의 답변과 유사하며 crontab 규칙 앞에 PATH가 정의되어 있습니다.


답변

당신은 당신의 crontab. 이것이 가장 안전한 옵션입니다.
그렇게하고 싶지 않다면 프로그램 주위에 래퍼 스크립트를 넣고 거기에 PATH를 설정할 수 있습니다.

예 :

01 01 * * * command

된다 :

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

또한에서 호출되는 모든 cron것은 실행되는 프로그램에 대해 매우주의해야하며 아마도 PATH변수에 대한 자체 선택을 설정해야 합니다.

편집하다:

which <command>쉘에서 실행하려는 명령의 위치를 ​​모르는 경우 경로를 알려줍니다.

EDIT2 :

따라서 프로그램이 실행되면 가장 먼저해야 할 일은 스크립트를 실행하는 데 필요한 값 으로 설정 PATH하고 다른 필수 변수 (예 LD_LIBRARY_PATH:)를 설정하는 것입니다.
기본적으로 프로그램 / 스크립트에 더 적합하도록 크론 환경을 수정하는 방법을 생각하는 대신 스크립트가 시작될 때 적절한 환경을 설정하여 주어진 환경을 처리하도록합니다.


답변

내 crontab의 명령 줄 바로 앞에 PATH 설정이 효과적이었습니다.

* * * * * PATH=$PATH:/usr/local/bin:/path/to/some/thing


답변

올바른 값으로 사용자 crontab에 PATH 정의를 추가하면 도움이 될 것입니다 … 저는 다음과 같이 채웠습니다.

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

그리고 모든 스크립트가 작동하도록하는 것으로 충분합니다. 필요한 경우 사용자 지정 경로를 포함합니다.


답변

당신의 변수가 당신을 위해 작동하도록 만드십시오.

/etc/profile.d/*.sh에 PATH를 정의하십시오.

시스템 전체 환경 변수

/etc/profile.d 디렉토리에있는 .sh 확장자를 가진 파일은 bash 로그인 셸이 입력 될 때마다 (예 : 콘솔에서 또는 ssh를 통해 로그인 할 때) 실행될 때마다 실행되며 데스크톱 세션이로드 될 때 DisplayManager에 의해 실행됩니다.

예를 들어 /etc/profile.d/myenvvars.sh 파일을 만들고 다음과 같이 변수를 설정할 수 있습니다.

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

로그인 옵션으로 crontab을 실행하십시오!

환경 변수가있는 CRONTAB 실행 스크립트 또는 명령

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


답변

문제

스크립트는 콘솔에서 실행할 때 작동하지만 cron에서는 실패합니다.

원인

crontab에 올바른 경로 변수 (및 셸)가 없습니다.

해결책

현재 셸을 추가하고 crontab 경로를 지정합니다.

당신을위한 스크립트

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

출처

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

샘플 출력

add_curent_shell_and_path_to_crontab.sh 예제 출력