환경 cron을 시뮬레이션하는 방법은 다음과 함께 스크립트를 실행합니까?
일반적으로 환경 설정이 없으므로 cron에서 스크립트를 실행하는 방법에 몇 가지 문제가 있습니다. cron과 동일한 방식으로 bash (?)를 호출하는 방법이 있으므로 스크립트를 설치하기 전에 테스트 할 수 있습니까?
이것을 cron에 추가하십시오 :
30 08 * * * env > ~/cronenv
실행 후 다음을 수행하십시오.
env - `cat ~/cronenv` /bin/sh
이것은 cron이 / bin / sh를 실행한다고 가정합니다. 이는 사용자의 기본 쉘에 관계없이 기본값입니다.
Cron은 기본적으로이 환경 만 제공합니다.
HOME
사용자의 홈 디렉토리LOGNAME
사용자의 로그인PATH=/usr/bin:/usr/sbin
SHELL=/usr/bin/sh
더 필요한 경우 crontab의 스케줄링 테이블 전에 환경을 정의하는 스크립트를 소싱 할 수 있습니다.
몇 가지 접근 방식 :
cron env를 내보내고 가져옵니다.
더하다
* * * * * env > ~/cronenv
crontab에 한 번 실행 한 다음 다시 끈 다음 실행하십시오.
env - `cat ~/cronenv` /bin/sh
그리고 당신은 이제
sh
cron의 환경을 가진 세션 안에 있습니다.cron에 환경을 가져 오십시오
당신은 위의 운동을 건너 뛸 수 있고
. ~/.profile
cron 작업 앞에서 예를 들어 할 수 있습니다.* * * * * . ~/.profile; your_command
화면 사용
위의 두 가지 솔루션은 실행중인 X 세션에 연결된 환경을 제공한다는 점에서 여전히 실패합니다
dbus
. 예를 들어, Ubuntu에서nmcli
(Network Manager)는 위의 두 가지 접근 방식에서 작동하지만 여전히 cron에서는 실패합니다.* * * * * /usr/bin/screen -dm
cron에 위의 줄을 추가하고 한 번 실행 한 다음 다시 끕니다. 화면 세션에 연결하십시오 (screen -r). 화면 세션을 확인하는 경우 (함께 생성 된
ps
그들이 자본에 때때로 (예를 것을 인식)ps | grep SCREEN
)이제는 짝수
nmcli
와 비슷한 것이 실패합니다.
당신은 실행할 수 있습니다 :
env - your_command arguments
빈 환경에서 your_command를 실행합니다.
계정의 셸에 따라
sudo su
env -i /bin/sh
또는
sudo su
env -i /bin/bash --noprofile --norc
에서 http://matthew.mceachen.us/blog/howto-simulate-the-cron-environment-1018.html
6 년 후 답변 : 환경 불일치 문제는 systemd
"타이머"가 cron 대체품으로 해결 한 문제 중 하나입니다 . CLI에서 또는 cron을 통해 시스템화 된 "서비스"를 실행할 때 환경 불일치 문제를 피하면서 정확히 동일한 환경을 수신합니다.
cron 작업이 수동으로 전달 될 때 실패하는 가장 일반적인 문제는 $PATH
cron에서 설정 한 제한적인 기본값 이며, 이는 Ubuntu 16.04에서 발생합니다.
"/usr/bin:/bin"
대조적 으로 Ubuntu 16.04에서 $PATH
설정 한 기본값 systemd
은 다음과 같습니다.
"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
따라서 시스템 타이머가 더 이상 번거 로움없이 바이너리를 찾을 가능성이 이미 높습니다.
시스템 타이머의 단점은 설정 시간이 조금 더 있다는 것입니다. 먼저 "서비스"파일을 작성하여 실행할 항목을 정의하고 "타이머"파일을 실행하여 스케줄을 정의한 후 타이머를 "활성화"하여 활성화하십시오.
env를 실행하고 stdout을 파일로 경로 재지 정하는 cron 작업을 작성하십시오. "env-"와 함께 파일을 사용하여 cron 작업과 동일한 환경을 작성하십시오.
cron의 부모는 init이므로 제어 터미널없이 프로그램을 실행한다는 것을 잊지 마십시오. 다음과 같은 도구로이를 시뮬레이션 할 수 있습니다.
기본적으로 cron
시스템의 아이디어가 무엇이든간에 작업을 실행합니다 sh
. 이것은 실제 Bourne 쉘 수 또는 수 dash
, ash
, ksh
또는 bash
(또는 다른)에 심볼릭 링크 sh
(및 POSIX 모드에서 실행 결과로).
가장 좋은 방법은 스크립트에 필요한 내용이 있는지 확인하고 아무것도 제공하지 않는다고 가정하는 것입니다. 따라서 전체 디렉토리 스펙을 사용하고 $PATH
자신 과 같은 환경 변수를 설정해야합니다 .
내가 찾은 또 다른 간단한 방법 (그러나 오류가 발생하기 쉬울 수도 있지만 테스트 중임)은 명령 전에 사용자의 프로필 파일을 제공하는 것입니다.
/etc/cron.d/ 스크립트 편집
* * * * * user1 comand-that-needs-env-vars
로 변할 것입니다 :
* * * * * user1 source ~/.bash_profile; source ~/.bashrc; comand-that-needs-env-vars
더럽지 만 그것은 나를 위해 일을 끝냈습니다. 로그인을 시뮬레이트하는 방법이 있습니까? 실행할 수있는 명령 만? bash --login
작동하지 않았다. 그래도 더 좋은 방법이 될 것 같습니다.
편집 : 이것은 확실한 해결책 인 것 같습니다 : http://www.epicserve.com/blog/2012/feb/7/my-notes-cron-directory-etccrond-ubuntu-1110/
* * * * * root su --session-command="comand-that-needs-env-vars" user1 -l
답변 https : //.com/a/2546509/5593430 은 cron 환경을 얻는 방법과 스크립트에 사용하는 방법을 보여줍니다. 그러나 사용하는 crontab 파일에 따라 환경이 다를 수 있습니다. 를 통해 환경을 저장하기 위해 세 가지 다른 cron 항목을 만들었습니다 env > log
. Amazon Linux 4.4.35-33.55.amzn1.x86_64의 결과입니다.
1. 루트 사용자가있는 전역 / etc / crontab
MAILTO=root
SHELL=/bin/bash
USER=root
PATH=/sbin:/bin:/usr/sbin:/usr/bin
PWD=/
LANG=en_US.UTF-8
SHLVL=1
HOME=/
LOGNAME=root
_=/bin/env
2. 루트 사용자 crontab ( crontab -e
)
SHELL=/bin/sh
USER=root
PATH=/usr/bin:/bin
PWD=/root
LANG=en_US.UTF-8
SHLVL=1
HOME=/root
LOGNAME=root
_=/usr/bin/env
3. /etc/cron.hourly/의 스크립트
MAILTO=root
SHELL=/bin/bash
USER=root
PATH=/sbin:/bin:/usr/sbin:/usr/bin
_=/bin/env
PWD=/
LANG=en_US.UTF-8
SHLVL=3
HOME=/
LOGNAME=root
가장 중요한 것은 PATH
, PWD
과는 HOME
다르다. 안정적인 환경에 의존하도록 cron 스크립트에서이를 설정하십시오.
나는 믿지 않는다. cron 작업을 테스트하는 유일한 방법은 나중에 1-2 분 동안 실행하도록 설정 한 다음 기다리는 것입니다.
'Programing' 카테고리의 다른 글
Django 쿼리를 값 목록으로 필터링하려면 어떻게해야합니까? (0) | 2020.04.08 |
---|---|
기존 소스에서 새 프로젝트를 작성할 때 Eclipse "잘못된 프로젝트 설명" (0) | 2020.04.08 |
업스트림에 연결하는 동안 (13 : 권한 거부) : [nginx] (0) | 2020.04.07 |
UIBarButtonItem을 표시하거나 숨기려면 어떻게합니까? (0) | 2020.04.07 |
2 단어 도시처럼 각 단어의 첫 문자를 대문자로 표시하는 방법은 무엇입니까? (0) | 2020.04.07 |