문제

매 시간마다 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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top