มีสาเหตุทั่วไปสามประการสำหรับคำสั่งงาน cron ที่จะทำงานแตกต่างกันเมื่อเปรียบเทียบกับคำสั่งที่พิมพ์ลงในเชลล์แบบโต้ตอบโดยตรงตามลำดับคร่าวๆ:
- Cron จัดให้มีสภาพแวดล้อมที่ จำกัด เช่น
$PATH
ตัวแปรขั้นต่ำและตัวแปรอื่น ๆ ที่ขาดหายไป
- Cron จะเรียกใช้
/bin/sh
ตามค่าเริ่มต้นในขณะที่คุณอาจใช้เชลล์ตัวอื่นแบบโต้ตอบ
- Cron ปฏิบัติต่อ
%
ตัวละครเป็นพิเศษ (มันจะกลายเป็นบรรทัดใหม่ในคำสั่ง)
- Cron ไม่ได้จัดเตรียมเทอร์มินัลหรือสภาพแวดล้อมแบบกราฟิก
คุณต้องนำหน้า%
อักขระทั้งหมดด้วย a \
ในไฟล์ crontab ซึ่งจะบอก cron ให้ใส่เปอร์เซ็นต์ในคำสั่ง จำไว้ว่าเมื่อคุณใช้date
คำสั่งในงาน cron
55 8 * * 3 /usr/bin/php /home/mark/dev/processes/customClient/events.php > "/home/mark/dev/processes/customClient/events-$(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d).csv"
0 9 * * 3 /usr/bin/echo 'The csv for last week, trying my hand at automatiging this' | /usr/bin/mutt <emailaddress> -s "Events from $(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d)" -a "/home/mark/dev/processes/customClient/events-$(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d).csv"
ฉันยังแก้ไขปัญหาการอ้างอิง:
- นี่ไม่ได้ทำให้คุณมีปัญหานอกเหนือจากความชัดเจน แต่คุณไม่ควรใช้ backticks เพื่อทดแทนคำสั่ง ใช้
$(…)
แทน: กฎการแยกวิเคราะห์นั้นง่ายกว่า
"$somevariable"
มักจะใช้คำพูดสองรอบตัวแปรและคำสั่งแทน: "$(somecommand)"
, ที่นี่การขาดเครื่องหมายคำพูดไม่เป็นอันตรายเพราะdate
คำสั่งไม่เคยส่งคืนอักขระพิเศษใด ๆ สำหรับรูปแบบที่คุณใช้ แต่คุณต้องจำอย่างระมัดระวังว่าอักขระใดเป็นพิเศษและตรวจสอบสิ่งนี้ทุกครั้งที่คุณออกจากการแทนที่โดยไม่มีการอ้างอิง ทำให้มันง่ายใช้เครื่องหมายคำพูดคู่เสมอยกเว้นว่าคุณต้องการให้การแบ่งฟิลด์และการสร้างชื่อไฟล์เกิดขึ้นกับผลลัพธ์
- คุณมีอัญประกาศเดี่ยวที่ป้องกันการขยายรอบการแทนที่คำสั่งบางอย่าง ใช้เครื่องหมายคำพูดคู่แทน
/bin/sh: 1: Syntax error: EOF in backquote substitution
สำหรับงาน cron แรก/bin/sh: 1: Syntax error: Unterminated quoted string
สำหรับงาน cron ที่สอง