기존 환경 변수로 cron 명령을 어떻게 실행할 수 있습니까?


114

기존 환경 변수로 cron 명령을 어떻게 실행할 수 있습니까?

쉘 프롬프트에 있으면 입력 echo $ORACLE_HOME하고 경로를 얻을 수 있습니다 . 이것은 내 환경 변수 중 하나입니다 ~/.profile. 그러나 ~/.profilefron cron 스크립트가로드되지 않으므로 $ORACLE_HOME변수가 설정되지 않아 스크립트가 실패 합니다.

에서 이 질문에 저자는 창조 언급한다 ~/.cronfile크론에 대한 변수를 설정 프로파일을 한 후 그는 자신의 유지 스크립트로 그의 모든 크론 명령로드 해결하지 ~/Cron디렉토리. 같은 파일 ~/.cronfile은 좋은 생각 처럼 들리지만 나머지 답변은 약간 성가신 것으로 보이며 누군가가 같은 결과를 얻는 더 쉬운 방법을 말해 줄 수 있기를 바랍니다.

스크립트를 시작할 때 비슷한 것을 추가 source ~/.profile할 수는 있지만 중복 될 수 있다고 생각합니다.

그렇다면 어떻게 cron 스크립트가 대화 형 쉘 프로파일에서 변수를로드 할 수 있습니까?


source ~/.profile프로그램에 중복을 추가하는 방법은 무엇입니까? 프로그램은 호출 프로그램에서 환경을 상속합니다. 해당 호출 프로그램이 쉘이 아닌 경우, 종속 프로그램은 원하는 환경을 어떻게 얻습니까?
Arcege

나는 이미 비슷한 질문에 대한 답변을 여기에 썼습니다 . su -l루트 또는 다른 특정 사용자에 대한 $ PATH를 포함하여 일반 로그인 환경을 설정하는 데 사용 됩니다.
tasket

답변:


141

crontab에서 명령을 실행하기 전에을 추가하십시오 . $HOME/.profile. 예를 들면 다음과 같습니다.

0 5 * * * . $HOME/.profile; /path/to/command/to/run

Cron껍질에 대해서는 아무것도 모른다. 시스템에 의해 시작되므로 환경이 최소화됩니다. 무언가를 원한다면 스스로 가져와야합니다.


14
뭐라고합니까 .스크립트 이전은 무엇입니까? (내가 어떻게 그런지 잘 모르겠습니다 man). 왜 이것과 다른가 source?
cwd

25
.명령은의 원래 명령입니다 source. 그것들은 쉘 내에서 동등하며, 특히 crontab 내에서 타이핑하기가 더 쉽습니다. 더 많은 정보를 얻으려면 , 맨 페이지에서 또는 zshbuiltins type .` 맨 위에 입력 help .하거나 검색 ^SHELL BUILTIN COMMANDS하십시오 .` 명령이 내장되어 있음을 알려줍니다. bashman . Running
Arcege

9
리눅스 배포판에 따라 변경해야 할 수 있습니다 .profile.bash_profile. .profile사용자의 홈 디렉토리에 어떤 파일이 있는지 확인하십시오 .
Frosty Z

@Arcege이 기능은 작동하지 않으며 (Fedora Core 21), 셸 수준이 낮아지기 때문이라고 생각합니다. 대신 소스를 사용하면 작동합니다.
Richard T

3
작동하지 않으면 cron 스크립트의 SHELL이 bash로 설정되지 않았기 때문에 예상과 같은 방식으로 실행되지 않을 수 있습니다.
Daniel Farrell

40

더 쉬운 또 다른 옵션은 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의 소스 다음에 오는 모든 명령은 마치 로그인 한 것처럼 환경을 갖게됩니다.


5
AWS Linux AMI에서 실행할 때 cron이 /bin/bash셸로 사용되지 않는 경우조차 발생하지 않았습니다 . cd /path/to/project; source .vars수동으로 입력했을 때 왜 작동하지만 File not foundcronjob에 포함되면 실패 하는지 () 궁금 합니다 . 나를위한 핵심 라인 SHELL=/bin/bash은 실제로 각 cronjob에서 익숙한 bash 명령을 사용할 수 있도록 설정 하는 것입니다. /bin/sh/(기본적으로 cron shell)은 매우 제한적입니다.
Hartley Brody

개별 환경 변수를 지정할 수있는 것처럼 크론 맨 위에 환경 파일을 지정할 수 없습니다. Systemd에는 EnvironmentFile서비스 장치가 있습니다. 너무 나쁜 cron에는 비슷한 것이 없습니다.
radtek

모든 스크립트가 모든 crontab에서 / bin / bash를 사용하도록 강제하십시오. 이는 좋은 생각이 아니며 cron 라인에 관한 것이기도합니다. * / 1 * * * * $ HOME / cron_job.sh… * / 1은 WHAT에 적합합니다. ?!? 하나의 스타가이, 지금은 미안 ... 최고의 말을 매우 혼란스러워하는 더러운 죄를 생각하는 스마트 사회에 대한 답변으로, 매 분마다 / 1 수단은 매 분마다 실행됩니다 실행된다는 것을 의미합니다
THESorcerer

1
이것이 바로 예입니다. 필요에 따라 조정하거나 전혀 사용하지 마십시오. 사람들마다 다른 뇌졸중.
Robert Brisita

4
경우 $SHELL이다 /bin/shsource명령이 존재하지 않습니다. .대신 사용하십시오 .
Melle

18

더 쉬운 또 다른 옵션은 cron으로 스크립트를 실행하고 bash에게 로그인하도록 지시하는 것입니다 (따라서 /etc/profile.d/...환경 정의를 사용하십시오)

에서 crontab -e파일 :

*/1 * * * * bash -l -c './cron_job.sh'
*/1 * * * * bash -l -c 'php -f ./cron_job.php'

소스 이후의 모든 명령 .bash_profile은 마치 로그인 한 것처럼 환경을 갖게됩니다.


10

나쁜 생각. 일반적인 관행은 크론 작업에서 실행되는 스크립트에서 필요한 모든 환경 변수를 구체적으로 설정하는 것입니다.


보안 프로세스 환경을 보장하는 @fpmurphy에 동의합니다. cron에서 변수를 거의 설정하지 않으려면 /usr/bin/env명령을 사용하여 변수를 설정 한 다음 cronjob의 환경 프로세스로 작동 할 수 있습니다.
Nikhil Mulley

daemontools 'envdir 도 생각납니다.
sr_

6
나는 모두 보안을 위해 노력하지만 파일을 만들어서 ~/.cronvars프로파일과 cron 스크립트에 포함 시킬 수 있습니다 . 경로가 변경 될 때 각 파일의 하드 코딩 된 경로를 유지하기가 쉽지 않기 때문에 내가 실행하는 각 스크립트에서 환경 변수를 하드 코딩하고 싶지 않습니다. 그런 식으로 필요한 변수를 중앙 집중식으로 배치하고 다른 변수를로드하지 못하게합니다.
cwd

4

이 구문은 확실히 도움이됩니다. 구문을 이해하지 못하지만 작동합니다. Oracle은 Oracle Configuration Manager를 crontab에 배포 할 때이 구문을 사용하므로 이것이 올바른 솔루션이라고 생각합니다.

0 5 * * * SOME_ENV_VAR=some_value some_command some_parameters

2

나는 최근에 전체 cronjob을 루트로 실행 해야하는 동시에 다른 사용자로 하위 명령을 실행 해야하는 경우를 보았습니다 (사용자 환경을 소싱해야 함). 나는 다음과 같은 접근 방식으로 갔다.

# m  h  dom  mon  dow  user  command
*/5  *   *    *    *   root  (sudo -i -u <the user> command-to-be-run-as-user) && command-to-be-run-as-root

중요한 부분은 주어진 명령을 별도의 로그인 쉘에서 실행 하는 인수 -i입니다 sudo(이는 사용자의 도트 파일이 소스 화됨을 의미합니다).

추신 : user열은 파일 /etc/crontab/etc/cron.d/*파일 에서만 사용할 수 있습니다.


1

나를 위해 일한 해결책은 여기 에 설명되어 있습니다 .

를 호출 . ~/.cronfile한 다음 원하는 작업을 수행 하는 랩퍼 스크립트를 작성합니다 . 이 스크립트는 cron에 의해 시작됩니다.

에서 ~/.cronfile당신이 당신의 cron 작업을위한 환경을 지정합니다.


1

예, "잘 알려진 해결 방법"(두 가지가 나열되어 있음)을 사용할 수 있습니다. 이것은 모든 사람들이 그것이 엉뚱하다는 것을 알고 있다고 말하는 또 다른 방법입니다. 비록 어떤 사람들은 적어도 당신 이이 실패 (우레)를 넘어서 많은 시간을 보냈기 때문에 이것을 "보안 기능"이라고 부를 것입니다. 시간 낭비가 아니었다. QWERTY 키보드와 동등한 크론입니다.

스크립트가 1 분에 한 번 실행되면 rc 스크립트를 읽는 데 시간이 걸리지 않는 원래 이유는 성능 때문일 수 있습니다. 또한 원래 cron은 실제로 구성 할 수 없었으므로 기본값은 실제로 유일한 옵션이었습니다.

cron이 사용자가 어리석은 쉘 체조를 수행하는 대신 대화식 쉘의 환경을 취하도록하는 간단한 구성이나 방법이 없어 보안이 강화되지 않습니다. 최신 머신에서는 매 분마다 많은 양의 작업이 실행되지 않는 한 일반적으로 성능이 크게 향상되지 않습니다.

유닉스 문화가 실패합니다. 내 소견에. :-)


1
"추가 보안이 없습니다." 사실이 아닙니다. 한 번 봐 가지고 CVE-2,011에서 1,095 사이 , CVE-2008-4304CVE-2010-3847를 .

그건 그렇고 나는 당신의 대답을 downvoted. 나는 보통 새로 온 사람들의 대답을 거절하지 않으려 고 노력하지만 보안은 나에게 중요하다. downvote를 잘못된 방식으로 사용하지 마십시오. 보안에 관한 부분 외에도 귀하의 답변은 우수하며 공감대가 필요합니다. 원하는 경우 여기에서 답변을 편집 할 수 있습니다 .

cron이 대화 형 플래그가 설정된 쉘을 사용하도록하는 것과 관련하여 가장 작은 것은 없습니다. 이것은 순수한 FUD입니다. 불행히도 나는 당신의 downvote를 downvote 수 없습니다. 불꽃처럼 보일지 모르지만 사람들이 세 개의 바퀴가 달린 차량이 더 좋다고 생각하면 매우 실망 스럽습니다. 네 번째 바퀴를 착용 해야하는 보안 문제가 있기 때문입니다. 그렇지 않습니다. 사람들은 세발 자전거를 타서 오랫동안 네 번째 바퀴를 추가하는 것이 가능하다는 것을 잊었습니다.
Austin S.

다시 말하면, 다른 응답자가 제안한 의도 된 여분의 후프 중 하나가 사용되는 경우, 언급 한 구멍에 어떻게 접근하지 못합니까? "* * * * * exec bash -i -c LOCALE = ......."
Austin S.

이것은 맹세처럼 읽습니다. 나는 그것이 어디서 질문에 대답하는지조차 알지 못한다. @EvanTeitelman, 보안 부분이 제거 되었더라도 질문에 대답하지 않아서 왜 투표가 필요한지 알 수 없습니다.
와일드 카드


1

프로필을 설정하는 대신에 설정하는 데 도움이되었습니다 PATH. cron 스크립트에서 일부 명령을 사용할 수 없었습니다 PATH.

ENVIRONMENT=prod
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
*/30 * * * * /opt/myscript1.sh
*/30 * * * * /opt/myscript2.sh
*/30 * * * * /opt/myscript3.sh

PATH명령 경로를 설정하면 도움이되었습니다. 템플릿을 사용하고 나중에 다시 시도하면 더 좋을 것입니다.

ENVIRONMENT={{ENVIRONMENT}}
PATH={{PATH}}
*/30 * * * * /opt/myscript1.sh
*/30 * * * * /opt/myscript2.sh
*/30 * * * * /opt/myscript3.sh

각 항목에 변수를 전달하는 것은 복잡해 보입니다.


-1

나는 넣었다. ~/.dbus/session-bus/*원하는 스크립트 상단에 :)


1
U & L SE에 오신 것을 환영합니다. 독자에게 도움이되도록 답변을 더 확장하십시오.
Ramesh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.