crontab이 사용할 환경 변수는 어디에서 설정할 수 있나요?
-
19-09-2019 - |
문제
매 시간마다 crontab이 실행됩니다.이를 실행하는 사용자의 환경 변수는 다음과 같습니다. .bash_profile
이는 사용자가 터미널에서 작업을 실행할 때 작동하지만 분명히 실행될 때 crontab에 의해 선택되지 않습니다.
나는 그것들을 설정해 보았습니다. .profile
그리고 .bashrc
하지만 아직 픽업되지 않은 것 같습니다.crontab이 선택할 수 있는 환경 변수를 어디에 둘 수 있는지 아는 사람이 있나요?
해결책
명령을 실행하기 전에 환경을 설정하는 쉘 스크립트를 'cron'으로 실행하도록 하십시오.
언제나.
# @(#)$Id: crontab,v 4.2 2007/09/17 02:41:00 jleffler Exp $
# Crontab file for Home Directory for Jonathan Leffler (JL)
#-----------------------------------------------------------------------------
#Min Hour Day Month Weekday Command
#-----------------------------------------------------------------------------
0 * * * * /usr/bin/ksh /work1/jleffler/bin/Cron/hourly
1 1 * * * /usr/bin/ksh /work1/jleffler/bin/Cron/daily
23 1 * * 1-5 /usr/bin/ksh /work1/jleffler/bin/Cron/weekday
2 3 * * 0 /usr/bin/ksh /work1/jleffler/bin/Cron/weekly
21 3 1 * * /usr/bin/ksh /work1/jleffler/bin/Cron/monthly
~/bin/Cron의 스크립트는 모두 다음과 같은 단일 스크립트 'runcron'에 대한 링크입니다.
: "$Id: runcron.sh,v 2.1 2001/02/27 00:53:22 jleffler Exp $"
#
# Commands to be performed by Cron (no debugging options)
# Set environment -- not done by cron (usually switches HOME)
. $HOME/.cronfile
base=`basename $0`
cmd=${REAL_HOME:-/real/home}/bin/$base
if [ ! -x $cmd ]
then cmd=${HOME}/bin/$base
fi
exec $cmd ${@:+"$@"}
(이전 코딩 표준을 사용하여 작성되었습니다. 요즘에는 시작 부분에 '#!'을 사용합니다.)
'~/.cronfile'은 cron에서 사용하기 위한 내 프로필의 변형입니다. 엄격하게 비대화형이며 시끄러운 소리를 내기 위해 에코가 없습니다.대신 .profile 등을 실행하도록 준비할 수 있습니다.(REAL_HOME 항목은 내 환경의 인공물입니다. $HOME과 동일한 것으로 가정할 수 있습니다.)
따라서 이 코드는 적절한 환경을 읽은 다음 홈 디렉터리에서 Cron이 아닌 버전의 명령을 실행합니다.예를 들어 'weekday' 명령은 다음과 같습니다.
: "@(#)$Id: weekday.sh,v 1.10 2007/09/17 02:42:03 jleffler Exp $"
#
# Commands to be done each weekday
# Update ICSCOPE
n.updics
'daily' 명령은 더 간단합니다:
: "@(#)$Id: daily.sh,v 1.5 1997/06/02 22:04:21 johnl Exp $"
#
# Commands to be done daily
# Nothing -- most things are done on weekdays only
exit 0
다른 팁
실행할 때 crontab 자체에서 환경 변수를 정의할 수 있습니다. crontab -e
명령줄에서.
LANG=nb_NO.UTF-8
LC_ALL=nb_NO.UTF-8
# m h dom mon dow command
* * * * * sleep 5s && echo "yo"
이 기능은 특정 cron 구현에서만 사용할 수 있습니다.현재 우분투와 데비안을 사용하고 있습니다. 빅시 크론 이를 통해 crontab 파일(또한 GNU)에서 선언할 수 있습니다. 맥론).
아치리눅스 그리고 빨간 모자 사용 크로니 어느 하지 않습니다 환경 변수가 선언되도록 허용하면 cron.log에 구문 오류가 발생합니다.해결 방법은 항목별로 수행할 수 있습니다.
# m h dom mon dow command
* * * * * export LC_ALL=nb_NO.UTF-8; sleep 5s && echo "yo"
이 문제에 대한 해결책이 하나 더 있습니다.
0 5 * * * . $HOME/.profile; /path/to/command/to/run
이 경우에는 정의된 모든 환경 변수를 선택합니다. $HOME/.profile
파일.
물론 $HOME
또한 설정되지 않은 경우 해당 경로를 전체 경로로 바꿔야 합니다. $HOME
.
변수 설정 /etc/environment
우분투에서도 나를 위해 일했습니다.12.04부터 변수는 /etc/environment
cron용으로 로드됩니다.
내가 더 쉽게 찾을 수 있는 @carestad 예제를 확장하면 cron을 사용하여 스크립트를 실행하고 스크립트에 환경을 두는 것입니다.
crontab -e 파일에서:
SHELL=/bin/bash
*/1 * * * * $HOME/cron_job.sh
cron_job.sh 파일에서:
#!/bin/bash
source $HOME/.bash_profile
some_other_cmd
.bash_profile 소스 이후의 모든 명령은 로그인한 것처럼 환경을 갖습니다.
다음을 사용하여 cron을 통해 실행 중인 스크립트를 시작하는 경우:
#!/bin/bash -l
그들은 당신을 데리러 가야합니다 ~/.bash_profile
환경 변수
저는 PHP 애플리케이션에 대한 환경 변수를 설정해야 했습니다.내 crontab에 다음 코드를 추가하여 다시 좋아했습니다.
$ sudo crontab -e
크론탭:
ENVIRONMENT_VAR=production
* * * * * /home/deploy/my_app/cron/cron.doSomethingWonderful.php
doSomethingWonderful.php 내에서 다음을 사용하여 환경 값을 얻을 수 있습니다.
<?php
echo $_SERVER['ENVIRONMENT_VAR']; # => "production"
이게 도움이 되길 바란다!
무엇을 설정하든 crontab
cronjob에서 직접 사용하거나 스크립트의 변수를 사용하여 사용할 수 있습니다.
cronjob 정의에 사용하십시오.
구성할 수 있습니다. crontab
그러면 cronjob에서 사용할 수 있는 변수가 설정됩니다.
$ crontab -l
myvar="hi man"
* * * * * echo "$myvar. date is $(date)" >> /tmp/hello
이제 파일 /tmp/hello
다음과 같은 내용을 보여줍니다.
$ cat /tmp/hello
hi man. date is Thu May 12 12:10:01 CEST 2016
hi man. date is Thu May 12 12:11:01 CEST 2016
cronjob이 실행하는 스크립트에서 사용하십시오.
구성할 수 있습니다. crontab
스크립트가 사용할 수 있는 변수를 설정합니다.
$ crontab -l
myvar="hi man"
* * * * * /bin/bash /tmp/myscript.sh
그리고 스크립트를 말해요 /tmp/myscript.sh
이렇습니다:
echo "Now is $(date). myvar=$myvar" >> /tmp/myoutput.res
파일을 생성합니다 /tmp/myoutput.res
전시:
$ cat /tmp/myoutput.res
Now is Thu May 12 12:07:01 CEST 2016. myvar=hi man
Now is Thu May 12 12:08:01 CEST 2016. myvar=hi man
...
대신에
0 * * * * sh /my/script.sh
bash -l -c 사용
0 * * * * bash -l -c 'sh /my/script.sh'
@Robert Brisita에서 확장하면 확장됩니다. 또한 스크립트에서 프로필의 모든 변수를 설정하지 않으려는 경우 스크립트 상단에서 내보낼 변수를 선택할 수 있습니다.
crontab -e 파일에서:
SHELL=/bin/bash
*/1 * * * * /Path/to/script/script.sh
script.sh에서
#!/bin/bash
export JAVA_HOME=/path/to/jdk
some-other-command
또 다른 방법 - 이것에서 영감을 얻었습니다 이 답변 - 변수를 "주입"하는 방법은 다음과 같습니다(fcron 예):
%daily 00 12 \
set -a; \
. /path/to/file/containing/vars; \
set +a; \
/path/to/script/using/vars
에서 help set
:
-a 내보내기 위해 수정되거나 생성된 변수를 표시합니다.
- 대신 +를 사용하면 이러한 플래그가 꺼집니다.
그래서 그 사이의 모든 것 set -
그리고 set +
로 수출됩니다 env
그런 다음 다른 스크립트 등에 사용할 수 있습니다.사용하지 않고 set
변수는 소싱되지만 set
오직.
그 외에도 프로그램을 실행하기 위해 루트가 아닌 계정이 필요하지만 다른 사용자 환경 내에 일부 변수가 필요할 때 변수를 전달하는 것도 유용합니다.다음은 전자 메일 헤더 형식을 지정하기 위해 nullmailer 변수를 전달하는 예입니다.
su -s /bin/bash -c "set -a; \
. /path/to/nullmailer-vars; \
set +a; \
/usr/sbin/logcheck" logcheck
제공된 대부분의 솔루션을 시도했지만 처음에는 아무것도 작동하지 않았습니다.하지만 실패한 것은 솔루션이 아니었음이 밝혀졌습니다.분명히, 내 ~/.bashrc
파일은 다음 코드 블록으로 시작됩니다.
case $- in
*i*) ;;
*) return;;
esac
이것은 기본적으로 case statement
현재 쉘의 현재 옵션 세트를 확인하여 쉘이 대화식으로 실행되고 있는지 확인합니다.쉘이 대화형으로 실행 중이라면 쉘은 소스를 소싱하는 단계로 넘어갑니다. ~/.bashrc
파일.그러나 호출된 쉘에서는 cron
, $-
변수에 다음이 포함되어 있지 않습니다. i
상호작용성을 나타내는 값입니다.그러므로, ~/.bashrc
파일이 완전히 소스화되지 않습니다.결과적으로 환경 변수가 설정되지 않았습니다.이것이 문제가 되는 경우 다음과 같이 코드 블록을 주석 처리하고 다시 시도하십시오.
# case $- in
# *i*) ;;
# *) return;;
# esac
이것이 도움이 되기를 바랍니다
나는 사용하고있다 Oh-my-zsh
내 Macbook에서는 crontab 작업을 실행하기 위해 많은 것을 시도했지만 마침내 내 솔루션은 .zshrc
실행 명령 앞에.
*/30 * * * * . $HOME/.zshrc; node /path/for/my_script.js
이 작업은 30분마다 실행되며 다음을 사용합니다. .zshrc
내 노드 명령을 실행하기 위한 프로필입니다.
앞에 점을 사용하는 것을 잊지 마세요. $HOME
var.