[linux] crontab에서 사용할 환경 변수를 어디에서 설정할 수 있습니까?

매시간마다 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 ${@:+"$@"}

(오래된 코딩 표준을 사용하여 작성했습니다. 요즘에는 처음에 shebang ‘#!’을 사용합니다.)

‘~ / .cronfile’은 엄청나게 비대화 형이며 시끄러운 소리를 내기 위해 cron에서 사용하는 프로파일의 변형입니다. 대신 .profile을 실행하도록 조정할 수 있습니다. (REAL_HOME 물건은 내 환경의 인공물입니다. $ HOME과 같은 척 할 수 있습니다.)

따라서이 코드는 적절한 환경을 읽은 다음 내 홈 디렉토리에서 비 크론 버전의 명령을 실행합니다. 예를 들어, ‘주중’명령은 다음과 같습니다.

:       "@(#)$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 -e명령 행에서 실행할 때 crontab 자체에서 환경 변수를 정의 할 수 있습니다 .

LANG=nb_NO.UTF-8
LC_ALL=nb_NO.UTF-8
# m h  dom mon dow   command

* * * * * sleep 5s && echo "yo"

이 기능은 특정 cron 구현에서만 사용할 수 있습니다. 우분투와 데비안은 현재 vixie-cron 을 사용하는데,이를 crontab 파일 (GNU mcron )에 선언 할 수 있습니다 .

아치 리눅스레드햇 사용 cronie 하지 않는 환경 변수가 선언 될 수 있도록하고, 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우분투 에서 vars를 설정하면 나를 위해 일했습니다. 12.04부터 /etc/environmentcron에 대한 변수 가로드됩니다.


답변

스크립트를 시작하면 다음과 같이 cron을 통해 실행됩니다.

#!/bin/bash -l

그들은 ~/.bash_profile환경 변수를 선택해야합니다


답변

내가 더 쉽게 찾은 @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의 소스 다음에 오는 모든 명령은 마치 로그인 한 것처럼 환경을 갖게됩니다.


답변

나를 위해 PHP 응용 프로그램의 환경 변수를 설정해야했습니다. crontab에 다음 코드를 추가하여 다시 사랑했습니다.

$ sudo  crontab -e

크론 탭 :

ENVIRONMENT_VAR=production

* * * * * /home/deploy/my_app/cron/cron.doSomethingWonderful.php

doSomethingWonderful.php 내부에서 다음을 사용하여 환경 값을 얻을 수 있습니다.

<?php
echo $_SERVER['ENVIRONMENT_VAR']; # => "production"

이게 도움이 되길 바란다!