나는이 #!/bin/bash
cron.week 디렉토리에 파일을.
작동하는지 테스트하는 방법이 있습니까? 일주일을 기다릴 수 없습니다
나는 루트로 데비안 6에 있습니다
crontab
몇 분마다 파일을 실행 하는 별도의 항목을 추가 하고 예상 결과가 있는지 확인한 다음 crontab에서 테스트 항목을 삭제하십시오. 시도crontab -e
나는이 #!/bin/bash
cron.week 디렉토리에 파일을.
작동하는지 테스트하는 방법이 있습니까? 일주일을 기다릴 수 없습니다
나는 루트로 데비안 6에 있습니다
crontab
몇 분마다 파일을 실행 하는 별도의 항목을 추가 하고 예상 결과가 있는지 확인한 다음 crontab에서 테스트 항목을 삭제하십시오. 시도crontab -e
답변:
cron 이하는 일을 수행하고 다음을 실행하십시오 root
.
run-parts -v /etc/cron.weekly
... 또는 "디렉토리가 아님 : -v"오류가 표시되면 다음 파일을 찾으십시오.
run-parts /etc/cron.weekly -v
옵션 -v
은 스크립트 이름이 실행되기 전에 인쇄합니다.
run-parts
주어진 디렉토리의 스크립트를 실행합니다. cron과 관련이 없습니다.
귀하의 질문의 범위를 벗어난 작은 소리 ...하지만 내가하는 일이 있습니다.
"크론 작업을 어떻게 테스트합니까?" 질문은 "다른 프로그램에서 시작한 비대화 형 컨텍스트에서 실행되는 스크립트를 어떻게 테스트합니까?"와 밀접한 관련이 있습니다. cron에서 트리거는 시간 조건이지만 많은 다른 * nix 시설은 대화식이 아닌 방식으로 스크립트 또는 스크립트 조각을 시작하며 종종 해당 스크립트가 실행되는 조건에 예기치 않은 무언가가 포함되어 버그가 정리 될 때까지 중단됩니다. ( https://stackoverflow.com/a/17805088/237059 참조 )
이 문제에 대한 일반적인 접근 방식이 도움이됩니다.
내가 좋아하는 기술 중 하나는 내가 작성한 ' 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
brew tap discoteq/discoteq; brew install flock
스크립트를 수정해야합니다/usr/local/bin/flock
즉시 호환되지 않는 cron의 일부 내용을 엉망으로 만든 후에 다음 접근법이 디버깅에 유용하다는 것을 알았습니다.
crontab -e
* * * * * /path/to/prog var1 var2 &>>/tmp/cron_debug_log.log
이 작업은 1 분에 한 번 작업을 실행하며 /tmp/cron_debug_log.log
파일을 살펴보면 진행중인 작업을 파악할 수 있습니다 .
그것은 당신이 찾고있는 "화재 작업"이 아니지만 처음에는 cron에서 작동하지 않은 스크립트를 디버깅 할 때 많은 도움이되었습니다.
>>/tmp/cron_debug_log.log 2>&1
대신 사용 하는 것이 좋습니다
/path/to/prog
소란 이니?
usr/home/myFancyScript.sh
간단 ls
하거나 또는 정기적으로 실행하려는 모든 것이 될 수 있습니다 .
잠금 파일을 사용하고 매분마다 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
flock(1)
쉘에서 사용할 수도 있습니다 . 참조하십시오 man 1 flock
. 자동 차단 기능을 제공하므로 이러한 용도에 매우 편리합니다.
이 답변 중 어느 것도 내 특정 상황에 맞지 않습니다. 즉, 하나의 특정 크론 작업을 한 번만 실행하고 즉시 실행하고 싶었습니다.
나는 우분투 서버에 있고 cPanel을 사용하여 cron 작업을 설정합니다.
현재 설정을 적어 둔 다음 지금부터 1 분이되도록 편집했습니다. 다른 버그를 수정했을 때, 지금부터 1 분 정도 다시 편집했습니다. 그리고 모든 작업이 끝나면 설정을 이전 상태로 다시 설정하기 만하면됩니다.
예 : 지금 오후 4시 34 분이므로 16시 35 분에 35 35 * * *를 실행합니다.
그것은 매력처럼 작동했으며, 내가 기다려야했던 가장 1 분도 채 걸리지 않았습니다.
매주 크론을 모두 실행하고 싶지 않고 매 분마다 작업을 실행하고 싶지 않기 때문에 이것이 다른 대답보다 더 나은 옵션이라고 생각했습니다. 다시 테스트 할 준비가되기 전에 문제가 무엇이든 해결하는 데 몇 분이 걸립니다. 잘하면 이것은 누군가를 돕는다.
나는 일반적으로 다음과 같이 만든 작업을 실행하여 테스트합니다.
이를 위해 두 개의 터미널을 사용하는 것이 더 쉽습니다.
작업 실행 :
#./jobname.sh
이동:
#/var/log and run
다음을 실행하십시오.
#tailf /var/log/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
의