기존 환경 변수로 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/sh의 source명령이 존재하지 않습니다. .대신 사용하십시오 .
— 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-4304 및 CVE-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.