ฉันมี#!/bin/bash
ไฟล์ในไดเรกทอรี cron.week
มีวิธีทดสอบว่าใช้ได้หรือไม่ รอไม่ได้ 1 สัปดาห์
ฉันอยู่บนเดเบียน 6 ด้วยรูท
crontab
ไฟล์ของคุณที่รันทุกสองสามนาทีดูว่ามีผลลัพธ์ที่คาดไว้หรือไม่จากนั้นลบรายการทดสอบออกจาก crontab ของคุณ ลองcrontab -e
ฉันมี#!/bin/bash
ไฟล์ในไดเรกทอรี cron.week
มีวิธีทดสอบว่าใช้ได้หรือไม่ รอไม่ได้ 1 สัปดาห์
ฉันอยู่บนเดเบียน 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 ได้อย่างไร" คำถามมีการเชื่อมต่ออย่างใกล้ชิดกับ "ฉันจะทดสอบสคริปต์ที่ทำงานในบริบทที่ไม่ใช่แบบโต้ตอบที่เปิดตัวโดยโปรแกรมอื่นได้อย่างไร" ใน cron ทริกเกอร์เป็นเงื่อนไขบางเวลา แต่สิ่งอำนวยความสะดวก * nix อื่น ๆ จำนวนมากเปิดใช้งานสคริปต์หรือแฟรกเมนต์สคริปต์ในวิธีที่ไม่โต้ตอบและบ่อยครั้งที่เงื่อนไขที่สคริปต์เหล่านั้นทำงานมีสิ่งที่ไม่คาดคิดและทำให้เกิดการแตก (ดูเพิ่มเติมที่: https://stackoverflow.com/a/17805088/237059 )
วิธีการทั่วไปในการแก้ไขปัญหานี้มีประโยชน์
หนึ่งในเทคนิคที่ฉันโปรดปรานคือการใช้สคริปต์ที่ฉันเขียนว่า ' crontest ' มันเริ่มต้นคำสั่งเป้าหมายภายในเซสชันหน้าจอ GNU จากภายใน cron เพื่อให้คุณสามารถแนบกับเทอร์มินัลแยกต่างหากเพื่อดูว่าเกิดอะไรขึ้นโต้ตอบกับสคริปต์หรือแม้แต่ใช้ดีบักเกอร์
ในการตั้งค่านี้คุณจะต้องใช้ "all stars" ในรายการ crontab ของคุณและระบุ crontest เป็นคำสั่งแรกในบรรทัดคำสั่งเช่น:
* * * * * crontest /command/to/be/tested --param1 --param2
ดังนั้นตอนนี้ cron จะรันคำสั่งของคุณทุกนาที แต่ crontest จะรับประกันได้ว่าจะมีเพียงหนึ่งอินสแตนซ์ที่ทำงานในแต่ละครั้ง หากคำสั่งใช้เวลาในการรันคุณสามารถทำ "screen -x" เพื่อแนบและดูคำสั่งนั้นได้ หากคำสั่งเป็นสคริปต์คุณสามารถวางคำสั่ง "read" ที่ด้านบนเพื่อหยุดและรอให้การแนบหน้าจอเสร็จสมบูรณ์ (กด Enter หลังจากติด)
หากคำสั่งของคุณเป็นสคริปต์ทุบตีคุณสามารถทำได้ดังนี้:
* * * * * 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
สิ่งนี้จะรันภารกิจหนึ่งครั้งต่อนาทีและคุณสามารถดู/tmp/cron_debug_log.log
ไฟล์เพื่อหาว่าเกิดอะไรขึ้น
มันไม่ใช่ "fire fire" ที่คุณอาจกำลังมองหา แต่สิ่งนี้ช่วยฉันได้มากเมื่อทำการดีบั๊กสคริปต์ที่ไม่ได้ทำงานใน cron ในตอนแรก
>>/tmp/cron_debug_log.log 2>&1
แทน
/path/to/prog
- 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
ไหม ค่อนข้างมีประโยชน์สำหรับการใช้งานดังกล่าวเนื่องจากมีการบล็อกอัตโนมัติ
สิ่งที่เกี่ยวกับการใส่ลงไปcron.hourly
รอจนกว่าจะทำงาน cron รายชั่วโมงต่อไปแล้วลบมัน? ที่จะทำงานครั้งเดียวภายในหนึ่งชั่วโมงและในสภาพแวดล้อม cron นอกจากนี้คุณยังสามารถเรียกใช้./your_script
แต่จะไม่มีสภาพแวดล้อมเดียวกันภายใต้ cron
คำตอบเหล่านี้ไม่ตรงกับสถานการณ์เฉพาะของฉันซึ่งฉันต้องการทำงาน cron หนึ่งงานเพียงครั้งเดียวและทำงานทันที
ฉันอยู่บนเซิร์ฟเวอร์ Ubuntu และฉันใช้ cPanel เพื่อตั้งค่างาน cron ของฉัน
ฉันเพิ่งเขียนการตั้งค่าปัจจุบันของฉันแล้วแก้ไขให้เป็นหนึ่งนาทีจากนี้ เมื่อฉันแก้ไขข้อผิดพลาดอื่นฉันเพิ่งแก้ไขอีกครั้งหนึ่งนาทีจากนี้ และเมื่อฉันทำเสร็จแล้วฉันเพิ่งรีเซ็ตการตั้งค่ากลับไปเป็นแบบเดิม
ตัวอย่าง: ตอนนี้เป็น 16:34 น. ดังนั้นฉันจึงใส่ 35 16 * * * เพื่อให้มันทำงานเวลา 16:35
มันใช้งานได้อย่างมีเสน่ห์และสิ่งที่ฉันต้องรอคือน้อยกว่าหนึ่งนาที
ฉันคิดว่านี่เป็นตัวเลือกที่ดีกว่าคำตอบอื่น ๆ เพราะฉันไม่ต้องการทำงาน crons รายสัปดาห์ทั้งหมดของฉันและฉันไม่ต้องการให้งานวิ่งทุกนาที ฉันใช้เวลาสองสามนาทีเพื่อแก้ไขปัญหาที่เกิดขึ้นก่อนที่ฉันจะพร้อมทดสอบอีกครั้ง หวังว่านี่จะช่วยใครซักคน
นอกจากนั้นคุณยังสามารถใช้:
http://pypi.python.org/pypi/cronwrap
เพื่อห่อ cron ของคุณเพื่อส่งอีเมลถึงคุณเมื่อสำเร็จหรือล้มเหลว
วิธีการแก้ปัญหาที่ฉันใช้มีดังนี้:
โดยปกติฉันจะทดสอบโดยใช้งานที่ฉันสร้างขึ้นเช่นนี้:
การใช้เทอร์มินัลสองเครื่องทำได้ง่ายกว่า
ทำงาน:
#./jobname.sh
ไปที่:
#/var/log and run
เรียกใช้ต่อไปนี้:
#tailf /var/log/cron
สิ่งนี้ทำให้ฉันเห็นการอัพเดตบันทึก cron แบบเรียลไทม์ นอกจากนี้คุณยังสามารถตรวจสอบบันทึกหลังจากที่คุณเรียกใช้ฉันชอบดูในเวลาจริง
นี่คือตัวอย่างของงาน cron อย่างง่าย กำลังอัปเดตยำ ...
#!/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/
ไดเรกทอรีนั้นจะต้องสามารถเรียกใช้งานได้โดย owner - octal700
แหล่งที่มา: man cron
และNNRooth
's
ฉันใช้Webminเพราะมันเป็นอัญมณีแห่งการเพิ่มผลผลิตสำหรับผู้ที่พบว่าการดูแลบรรทัดคำสั่งค่อนข้างน่ากลัวและไม่ยอมรับ
มีปุ่ม "บันทึกและเรียกใช้ตอนนี้" ในเว็บ "ระบบ> งาน Cron ตามกำหนดเวลา> แก้ไขเว็บ Cron Job"
มันแสดงผลลัพธ์ของคำสั่งและเป็นสิ่งที่ฉันต้องการ