cron이 올바른 PATH를 호출하도록하려고합니다. 쉘에서 Python 스크립트를 실행하면 bashrc에 설정된 PATH를 사용하므로 스크립트가 잘 실행되지만 cron을 사용할 때 모든 PATH는 bashrc에서 사용되지 않습니다. bashrc와 같은 cron에 대한 PATH를 입력 할 수있는 파일이나 bashrc에서 PATH를 호출하는 방법이 있습니까?
죄송합니다. 내가 올바르게 말한 것 같지 않습니다. 올바른 스크립트를 실행할 수 있습니다 (크론 탭의 스크립트에 대한 PATH가 여기서 문제가되지 않음을 의미합니다). 그 스크립트가 실행 중일 때 빌드를 실행하고 이것은 경로의 설정 .bashrc
. 로그인 할 때 스크립트를 실행하면 .bashrc
PATH가 풀인됩니다 .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