매주 크론 작업을 테스트하는 방법? [닫은]
나는이 #!/bin/bash
cron.week 디렉토리에 파일을.
작동하는지 테스트하는 방법이 있습니까? 일주일을 기다릴 수 없습니다
나는 루트로 데비안 6에 있습니다
cron의 기능을 수행하고 다음을 실행하십시오 root
.
run-parts -v /etc/cron.weekly
... 또는 "디렉토리가 아님 : -v"오류가 표시되면 다음 것 :
run-parts /etc/cron.weekly -v
옵션 -v
은 스크립트 이름이 실행되기 전에 인쇄합니다.
귀하의 질문의 범위를 벗어난 작은 소리 ...하지만 내가하는 일이 있습니다.
"크론 작업을 어떻게 테스트합니까?" 질문은 "다른 프로그램에서 시작한 비대화 형 컨텍스트에서 실행되는 스크립트를 어떻게 테스트합니까?"와 밀접한 관련이 있습니다. cron에서 트리거는 시간 조건이지만 많은 다른 * nix 시설은 비 대화식 방식으로 스크립트 또는 스크립트 조각을 시작하며 종종 해당 스크립트가 실행되는 조건에 예기치 않은 무언가가 포함되어 버그가 정리 될 때까지 중단됩니다.
이 문제에 대한 일반적인 접근 방식이 도움이됩니다.
내가 좋아하는 기술 중 하나는 내가 작성한 ' crontest ' 라는 스크립트를 사용하는 것 입니다. cron 내에서 GNU 화면 세션 내에서 target 명령을 실행하여 별도의 터미널에 연결하여 진행 상황을 확인하고 스크립트와 상호 작용하며 디버거를 사용할 수도 있습니다.
이를 설정하려면 crontab 항목에서 "all stars"를 사용하고 명령 행에서 첫 번째 명령으로 crontest를 지정하십시오.
* * * * * crontest /command/to/be/tested --param1 --param2
이제 cron은 1 분마다 명령을 실행하지만 crontest는 한 번에 하나의 인스턴스 만 실행되도록합니다. 명령을 실행하는 데 시간이 걸리면 "screen -x"를 수행하여 명령을 연결하고 실행할 수 있습니다. 명령이 스크립트 인 경우 상단에 "읽기"명령을 넣어 중지시키고 화면 첨부가 완료 될 때까지 기다릴 수 있습니다 (첨부 후 Enter 키를 누르십시오)
명령이 bash 스크립트 인 경우 대신 다음을 수행하십시오.
* * * * * crontest --bashdb /command/to/be/tested --param1 --param2
이제 "screen -x"로 연결하면 대화식 bashdb 세션에 직면하게되며 코드를 단계별로 실행하고 변수 등을 검사 할 수 있습니다.
#!/bin/bash
# crontest
# See https://github.com/Stabledog/crontest for canonical source.
# Test wrapper for cron tasks. The suggested use is:
#
# 1. When adding your cron job, use all 5 stars to make it run every minute
# 2. Wrap the command in crontest
#
#
# Example:
#
# $ crontab -e
# * * * * * /usr/local/bin/crontest $HOME/bin/my-new-script --myparams
#
# Now, cron will run your job every minute, but crontest will only allow one
# instance to run at a time.
#
# crontest always wraps the command in "screen -d -m" if possible, so you can
# use "screen -x" to attach and interact with the job.
#
# If --bashdb is used, the command line will be passed to bashdb. Thus you
# can attach with "screen -x" and debug the remaining command in context.
#
# NOTES:
# - crontest can be used in other contexts, it doesn't have to be a cron job.
# Any place where commands are invoked without an interactive terminal and
# may need to be debugged.
#
# - crontest writes its own stuff to /tmp/crontest.log
#
# - If GNU screen isn't available, neither is --bashdb
#
crontestLog=/tmp/crontest.log
lockfile=$(if [[ -d /var/lock ]]; then echo /var/lock/crontest.lock; else echo /tmp/crontest.lock; fi )
useBashdb=false
useScreen=$( if which screen &>/dev/null; then echo true; else echo false; fi )
innerArgs="$@"
screenBin=$(which screen 2>/dev/null)
function errExit {
echo "[-err-] $@" | tee -a $crontestLog >&2
}
function log {
echo "[-stat-] $@" >> $crontestLog
}
function parseArgs {
while [[ ! -z $1 ]]; do
case $1 in
--bashdb)
if ! $useScreen; then
errExit "--bashdb invalid in crontest because GNU screen not installed"
fi
if ! which bashdb &>/dev/null; then
errExit "--bashdb invalid in crontest: no bashdb on the PATH"
fi
useBashdb=true
;;
--)
shift
innerArgs="$@"
return 0
;;
*)
innerArgs="$@"
return 0
;;
esac
shift
done
}
if [[ -z $sourceMe ]]; then
# Lock the lockfile (no, we do not wish to follow the standard
# advice of wrapping this in a subshell!)
exec 9>$lockfile
flock -n 9 || exit 1
# Zap any old log data:
[[ -f $crontestLog ]] && rm -f $crontestLog
parseArgs "$@"
log "crontest starting at $(date)"
log "Raw command line: $@"
log "Inner args: $@"
log "screenBin: $screenBin"
log "useBashdb: $( if $useBashdb; then echo YES; else echo no; fi )"
log "useScreen: $( if $useScreen; then echo YES; else echo no; fi )"
# Were building a command line.
cmdline=""
# If screen is available, put the task inside a pseudo-terminal
# owned by screen. That allows the developer to do a "screen -x" to
# interact with the running command:
if $useScreen; then
cmdline="$screenBin -D -m "
fi
# If bashdb is installed and --bashdb is specified on the command line,
# pass the command to bashdb. This allows the developer to do a "screen -x" to
# interactively debug a bash shell script:
if $useBashdb; then
cmdline="$cmdline $(which bashdb) "
fi
# Finally, append the target command and params:
cmdline="$cmdline $innerArgs"
log "cmdline: $cmdline"
# And run the whole schlock:
$cmdline
res=$?
log "Command result: $res"
echo "[-result-] $(if [[ $res -eq 0 ]]; then echo ok; else echo fail; fi)" >> $crontestLog
# Release the lock:
9<&-
fi
즉시 호환되지 않는 cron의 일부 내용을 엉망으로 만든 후에 다음 접근법이 디버깅에 좋습니다.
crontab -e
* * * * * /path/to/prog var1 var2 &>>/tmp/cron_debug_log.log
이 작업은 1 분에 한 번 작업을 실행하며 /tmp/cron_debug_log.log
파일을 살펴보면 진행중인 작업을 파악할 수 있습니다 .
그것은 당신이 찾고있는 "화재 작업"이 아니지만 처음에는 cron에서 작동하지 않은 스크립트를 디버깅 할 때 많은 도움이되었습니다.
잠금 파일을 사용하고 매분마다 cron 작업이 실행되도록 설정했습니다. (crontab -e 및 * * * * * / path / to / job 사용) 이렇게하면 파일을 계속 편집 할 수 있으며 매분 테스트됩니다. 또한 잠금 파일을 터치하여 cronjob을 중지 할 수 있습니다.
#!/bin/sh
if [ -e /tmp/cronlock ]
then
echo "cronjob locked"
exit 1
fi
touch /tmp/cronlock
<...do your regular cron here ....>
rm -f /tmp/cronlock
무엇으로 퍼팅에 대해 cron.hourly
그것을 제거 후, 시간당 cron 작업의 다음 실행 때까지 기다리고? 그것은 한 시간 안에 한 번, cron 환경에서 실행됩니다. 을 실행할 수도 ./your_script
있지만 cron에서와 동일한 환경을 갖지는 않습니다.
그 외에도 다음을 사용할 수 있습니다.
http://pypi.python.org/pypi/cronwrap
성공 또는 실패시 이메일을 보내도록 cron을 마무리합니다.
이 답변 중 어느 것도 내 특정 상황에 맞지 않습니다. 즉, 특정 크론 작업을 한 번만 실행하고 즉시 실행하고 싶었습니다.
나는 우분투 서버에 있고 cPanel을 사용하여 cron 작업을 설정합니다.
현재 설정을 적어두고 1 분 후에 편집했습니다. 다른 버그를 수정했을 때, 지금부터 1 분 정도 다시 편집했습니다. 그리고 모든 작업이 끝나면 설정을 이전 상태로 다시 설정하기 만하면됩니다.
예 : 지금 오후 4시 34 분이므로 16:16에 실행되도록 35 16 * * *를 입력했습니다.
그것은 매력처럼 작동했으며, 내가 기다려야했던 가장 1 분도 채 걸리지 않았습니다.
매주 크론을 모두 실행하고 싶지 않고 매 분마다 작업을 실행하고 싶지 않기 때문에 이것이 다른 답변보다 더 나은 옵션이라고 생각했습니다. 다시 테스트 할 준비가되기 전에 문제가 무엇이든 해결하는 데 몇 분이 걸립니다. 잘하면 이것은 누군가를 돕는다.
나는 일반적으로 다음과 같이 만든 작업을 실행하여 테스트합니다.
이를 위해 두 개의 터미널을 사용하는 것이 더 쉽습니다.
작업 실행 :
#./jobname.sh
이동:
#/var/log and run
다음을 실행하십시오.
#tailf /var/log/cron
이를 통해 크론 로그가 실시간으로 업데이트되는 것을 볼 수 있습니다. 로그를 실행 한 후 검토 할 수도 있습니다. 실시간으로 보는 것이 좋습니다.
다음은 간단한 cron 작업의 예입니다. yum 업데이트 실행 중 ...
#!/bin/bash
YUM=/usr/bin/yum
$YUM -y -R 120 -d 0 -e 0 update yum
$YUM -y -R 10 -e 0 -d 0 update
고장은 다음과 같습니다.
첫 번째 명령은 yum 자체를 업데이트하고 다음 명령은 시스템 업데이트를 적용합니다.
-R 120 : yum이 명령을 수행하기 전에 기다리는 최대 시간을 설정합니다
-e 0 : 오류 수준을 0 (범위 0-10)으로 설정합니다. 0은 반드시 알려야 할 중대한 오류 만 인쇄 함을 의미합니다.
-d 0 : 디버깅 수준을 0으로 설정합니다. 인쇄되는 양을 늘리거나 줄입니다. (범위 : 0-10).
-y : 예라고 가정하십시오. 질문에 대한 답변이 예라고 가정
cron 작업을 빌드 한 후 아래 명령을 실행하여 작업을 실행 가능하게 만들었습니다.
#chmod +x /etc/cron.daily/jobname.sh
이것이 도움이 되었기를 바랍니다, Dorlack
sudo run-parts --test /var/spool/cron/crontabs/
해당 crontabs/
디렉토리의 파일은 소유자 가 실행할 수 있어야합니다. -octal700
출처 : man cron
와 NNRooth
의
내가 사용하는 솔루션은 다음과 같습니다.
- crontab (명령 : crontab -e 사용)을 편집하여 필요한만큼 자주 (1 분 또는 5 분마다) 작업을 실행하십시오.
- 출력을 일부 파일로 인쇄하기 위해 cron을 사용하여 실행되어야하는 쉘 스크립트를 수정하십시오 (예 : echo "Working fine">>
output.txt) - tail -f output.txt 명령을 사용하여 output.txt 파일을 확인하십시오.이 명령은이 파일에 최근 추가 된 내용을 인쇄하므로 스크립트 실행을 추적 할 수 있습니다
나는 Webmin을 사용 하고 있습니다. 커맨드 라인 관리가 약간 까다 롭고 흠이없는 사람을위한 생산성 보석이기 때문입니다.
"시스템> 예약 된 Cron 작업> Cron 작업 편집"웹 인터페이스에 "지금 저장 및 실행"단추가 있습니다.
명령의 출력을 표시하며 정확히 내가 필요한 것입니다.
참고 URL : https://stackoverflow.com/questions/4984725/how-to-test-a-weekly-cron-job
'IT story' 카테고리의 다른 글
Linq- 엔티티-SQL“IN”절 (0) | 2020.04.18 |
---|---|
`from… import` 대`import .` (0) | 2020.04.18 |
지속 시간에 정수를 곱하는 방법? (0) | 2020.04.18 |
Linux에서 깨진 scp (보안 복사) 명령 프로세스를 계속할 수있는 방법이 있습니까? (0) | 2020.04.18 |
npm을 통해 Twitter Bootstrap을 설치하는 목적은 무엇입니까? (0) | 2020.04.18 |