วิธีรัน Shell Script โดย Cron Job

ฉันมีสคริปต์เชลล์เหมือนด้านล่าง

 echo "Hello World"

สคริปต์อยู่ในโฟลเดอร์ /root/scripts/ เป็น test.sh

ฉันยังสร้างงาน cron เหมือนด้านล่าง

  0-59 * * * *  ./scripts/test.sh

ตอนนี้งาน cron ไม่ได้พิมพ์เนื้อหาใน test.sh ทุกนาที

แจ้งให้เราทราบว่าฉันให้ไดเร็กทอรีผิดหรือมีปัญหาอื่นใดในโค้ดของฉัน


person user1093513    schedule 13.08.2012    source แหล่งที่มา


คำตอบ (4)


ฉันจะ

  1. มีความชัดเจน wrt ไดเร็กทอรีของคุณเพื่อดำเนินการจากเช่น /root/scripts/test.sh. ฉันไม่รู้ว่า cron ใดที่จะถือเป็นไดเรกทอรี ปัจจุบัน
  2. เปลี่ยนเส้นทาง stdout ไปยังไฟล์บันทึกเช่น ...test.sh > /tmp/cron.log (คุณอาจต้องการเปลี่ยนเส้นทาง stderr ในบางขั้นตอนด้วยโดยใช้ 2>&1) ไม่เช่นนั้นคุณจะไม่เห็นผลลัพธ์ มันจะถูกส่งถึงเจ้าของ cronjob
  3. ตรวจสอบให้แน่ใจว่าคุณได้ให้สิทธิ์ดำเนินการกับสคริปต์ทุบตีของคุณ (chmod +x /root/scripts/test.sh)
  4. ระบุให้ชัดเจนว่าสคริปต์ใดที่ปฏิบัติการได้ที่จะรันเชลล์สคริปต์ของคุณ แนวปฏิบัติที่ดีที่จะมีการเรียกใช้สคริปต์ที่ด้านบน เช่น #!/bin/sh หรือคล้ายกัน

การทำให้สิ่งต่าง ๆ ทำงานภายใต้ cron นั้นเป็นเรื่องยากอย่างฉาวโฉ่ งาน Cron ทำงานโดยมีสภาพแวดล้อมที่ถูกตัดทอนลงอย่างมาก แนะนำให้พิมพ์สภาพแวดล้อมที่มีให้กับสคริปต์ของคุณ (ใช้ env) และเปรียบเทียบ/เปรียบต่างกับสิ่งที่คุณมีจากเชลล์เชิงโต้ตอบของคุณ

person Brian Agnew    schedule 13.08.2012
comment
เมื่อสคริปต์ถูกเรียกใช้งาน ฉันจะเห็นสวัสดีชาวโลกในเทอร์มินัลใช่ไหม - person user1093513; 13.08.2012
comment
ไม่ เอาต์พุตจากคำสั่ง cron จะถูกส่งไปยังเจ้าของ crontab ทางอีเมล - person Douglas Leeder; 13.08.2012
comment
@DouglasLeeder - ขอบคุณสำหรับการส่งจดหมายอีกครั้ง ฉันได้รวมสิ่งนั้นไว้ในคำตอบแล้ว - person Brian Agnew; 13.08.2012

คุณควรใช้

* * * * * /path/to/scriptFile

เพื่อรันสคริปต์ทุกนาที

และตรวจสอบเจ้าของโฟลเดอร์สคริปต์ของคุณหากเจ้าของไม่ได้รับอนุญาตให้รันสคริปต์ให้อนุญาตหรือเปลี่ยนเจ้าของที่ได้รับอนุญาต

person Vaibhav Jain    schedule 31.08.2013
comment
สวัสดี ฉันเขียนสคริปต์ที่ใช้งานได้ดีถ้าฉันใช้มันด้วยตนเองโดยไม่ต้องใช้ cron แต่บน cron มันจะไม่ทำงาน นี่คือ cron ของฉัน: * * * * * sudo /opt/modulo/log/check.sh หากคุณสามารถช่วยฉันได้ ฉันจะมีความสุข - person Tomer; 14.05.2017

ปัญหาทั่วไปที่ผู้ใช้ Unix ใหม่พบเมื่อใช้ cron เพื่อเรียกใช้สคริปต์ก็คือ cronjobs ไม่สามารถเข้าถึงสภาพแวดล้อมเดียวกันกับเชลล์ผู้ใช้ได้ ดังนั้นสคริปต์ที่ดำเนินการในเชลล์ของผู้ใช้จึงทำงานได้อย่างสมบูรณ์ แต่จะล้มเหลวเมื่อเรียกใช้จาก cron ผู้ร้ายอันดับหนึ่งในกรณีนี้คือตัวแปรสภาพแวดล้อม $PATH ของเชลล์ของคุณแตกต่างจากเชลล์ของ cronjob

เพื่อทดสอบการรัน '/bin/echo $PATH > myShellPath' ใน cron run '/bin/echo $PATH > myCronPath' เปรียบเทียบ myShellPath กับ myCronPath

ในตัวอย่างที่จัดเตรียมไว้ให้สคริปต์ดำเนินการ echo ซึ่งในระบบ CENTOS6 ของฉันอยู่ภายใต้ /bin เชลล์พบคำสั่ง echo โดยการค้นหาไฟล์ 'echo' ในไดเร็กทอรีรายการใดรายการหนึ่งในตัวแปรสภาพแวดล้อม $PATH หากตัวแปรสภาพแวดล้อม $PATH ของ cronjob ของคุณไม่มี /bin คำสั่ง echo จะล้มเหลว

หากนี่คือปัญหา วิธีแก้ไขที่ง่ายที่สุดคือกำหนดเส้นทางไปที่ 'echo' ในสคริปต์ของคุณอย่างชัดเจน หากต้องการดูเส้นทางเต็มของระบบสำหรับเสียงสะท้อน ให้พิมพ์ 'ซึ่งเสียงสะท้อน' ที่เปลือกของคุณ

ตัวอย่าง:

[countChocula@bozo ~]$ which echo
/bin/echo

ในกรณีนี้ คุณจะต้องแก้ไขสคริปต์และแทนที่ 'echo' ด้วย '/bin/echo' ยังดีกว่า ให้ตั้งค่าตัวแปร $PATH ในสคริปต์ของคุณเพื่อรวมไดเร็กทอรีที่มีเสียงสะท้อนอยู่

สำหรับข้อมูลเพิ่มเติม ให้ค้นคว้า "ฉันใช้เชลล์ใดและตั้งค่าตัวแปรสภาพแวดล้อมของฉันอย่างไร", "cron ใช้เชลล์ใด และฉันจะตั้งค่าตัวแปรสภาพแวดล้อม cron ได้อย่างไร", "จะดูตัวแปรสภาพแวดล้อมของ cronjob ของฉันได้อย่างไร"

person mcchiz    schedule 05.04.2014

เมื่อคุณเพิ่มไฟล์ใน cron ไม่เข้าใจ './scripts/test.sh' ดังนั้นคุณควรเพิ่ม cron ดังนี้:

  0-59 * * * *  bash /root/scripts/test.sh

และคุณเพิ่มการอนุญาตสำหรับไฟล์เป็น:

chmod a+x /root/scripts/test.sh

เมื่อสคริปต์ทำงานก็โอเค

person Tannetto    schedule 16.01.2017