งาน cron รายวันไม่ทำงาน


10

ภาพรวมอย่างรวดเร็ว: ฉันมีสคริปต์ที่จะสำรองข้อมูลทุกวันที่เก็บซอร์สโค้ดของฉันจาก SVN ลงใน tarball สำหรับวันนั้น ฉันได้ทดสอบสคริปต์และทำงานได้ดีตราบใดที่ฉันเรียกใช้เป็น sudo เนื่องจากการเป็นเจ้าของไดเรกทอรีผลลัพธ์

ดังนั้นปัญหาคือฉันต้องการเรียกใช้รายวันนี้ดังนั้นฉันจึงใส่ลิงค์ไว้ในไดเรกทอรี /etc/cron.daily นี่คือเนื้อหาของไดเรกทอรี

thom@spenser:/etc/cron.daily$ ls -l
total 60
-rwxr-xr-x 1 root root   189 2011-09-14 02:21 apport
-rwxr-xr-x 1 root root 15535 2011-10-06 11:30 apt
-rwxr-xr-x 1 root root   314 2011-08-08 16:57 aptitude
lrwxrwxrwx 1 root root    24 2012-02-28 11:05 backup -> /usr/local/bin/backup.sh
-rwxr-xr-x 1 root root   502 2011-06-08 11:48 bsdmainutils
-rwxr-xr-x 1 root root   256 2011-10-06 04:04 dpkg
-rwxr-xr-x 1 root root   372 2011-10-04 16:50 logrotate
-rwxr-xr-x 1 root root  1353 2011-07-27 07:17 man-db
-rwxr-xr-x 1 root root   606 2011-08-17 09:16 mlocate
-rwxr-xr-x 1 root root   249 2011-06-24 05:36 passwd
-rwxr-xr-x 1 root root  2417 2011-07-01 17:25 popularity-contest
-rwxr-xr-x 1 root root   383 2011-09-30 15:09 samba
-rwxr-xr-x 1 root root  3594 2011-09-19 20:07 standard
thom@spenser:/etc/cron.daily$ 

ปัญหาคือมันไม่เคยทำงาน นี่คือการอนุญาตสำหรับสคริปต์นั้น:

thom@spenser:/etc/cron.daily$ ls -l /usr/local/bin/backup.sh 
-rwxr-xr-x 1 root root 260 2012-02-28 11:03 /usr/local/bin/backup.sh

ไอเดีย?


2
หากเป็นไปได้โปรดพิจารณาปิดคำถามที่เปิดอื่น ๆ ของคุณโดยเลือกคำตอบที่ดีที่สุด (ถ้ามี) เราต้องการให้ผู้ใช้รักษาคำถามของพวกเขาเพื่อให้เว็บไซต์สามารถเป็นเครื่องมือที่มีประสิทธิภาพสำหรับบุคคลต่อไปที่มีปัญหาของคุณ สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการปฏิบัติที่ดีที่สุดพิจารณาอ่านคำถามที่พบบ่อยเกี่ยวกับการถามคำถาม
Bruno Pereira

คำตอบ:


37

พยายามนี้

run-parts --test /etc/cron.daily

พบว่าการอัพเดตไฟล์ของฉัน Ubuntu ไม่ได้เกิดขึ้น สังเกตว่าไฟล์ของฉันมีนามสกุล (มีจุดอยู่ในนั้น)

ขั้นตอนในการแก้ไขปัญหานี้

  1. เปลี่ยนชื่อของฉันupdate.ubuntuเป็นupdate-ubuntu
  2. ตอนนี้อีกครั้งrun-parts --test /etc/cron.dailyคราวนี้ไฟล์ของฉันมา!

1
ใช่สิ่งนี้แก้ไขได้สำหรับฉัน ไม่ชอบจุดในชื่อไฟล์การเปลี่ยนชื่อไฟล์จาก myscript.sh เป็น myscript นั้นเหมาะสำหรับฉัน
Matt Parkins

3
สิ่งนี้จะต้องสูงขึ้น ฉันบันทึกสคริปต์ไว้เป็น "backup.sh" แบบดั้งเดิม การลบส่วน ".sh" ออกไปแก้ไขได้ ขอบคุณตัน!
David

ขอบคุณ! คนที่แต่งตัวประหลาด / ผู้ตัดสินใจที่จะลบไฟล์. sh จาก cron รายวันควรถูกทำให้อาย!
Sylvain

ควรถูกเฆี่ยนตีอย่างเปิดเผย! ;-) ฉันสงสัยว่าเวลาที่ผู้คนสูญเสียไปโดยรวมเนื่องจากการตัดสินใจนี้ ... ฉันยังสงสัยว่ามีเหตุผลที่ดีหรือไม่?
xastor

3

อาจเป็นหนึ่งในหลาย ๆ สิ่ง:

เส้นทางราก:

คุณอาจต้องขยายตัวแปร PATH ของผู้ใช้รูทโดยการวางบรรทัดต่อไปนี้ที่ด้านบนของไฟล์ crontab ของพวกเขา:

PATH = / usr / sbin: / usr / bin: / sbin: / bin

src: https://help.ubuntu.com/community/CronHowto

หรือเพียงแค่ใช้เส้นทางแบบเต็มไปยังแต่ละคำสั่งในสคริปต์ของคุณ: /bin/lsแทนที่จะlsเป็นตัวอย่าง ( which lsที่บรรทัดคำสั่งสำหรับเส้นทาง)

มีเป็นข้อผิดพลาดแปลก ๆ เกี่ยวกับจุดในชื่อไฟล์ที่มีการรายงานที่นี่ อาจขยายไปยังไฟล์ที่คุณเชื่อมโยงถึงแม้ว่าสิ่งนี้อาจไม่น่าเป็นไปได้

คุณบันทึกผลลัพธ์จากไฟล์สำรองหรือไม่ ใส่สิ่งนี้ในบรรทัดแรกเพื่อช่วยในการตรวจสอบว่ามันไม่ได้ทำงานเลยหรือทำงานอยู่

/bin/echo "Attempting to run backup" >> /path-to-home/backup.log

หรือลองเพิ่มสคริปต์ลงในไฟล์ crontab โดยตรง:

sudo -i
crontab -e
[add the next line to the file, then save and exit]
33 15 * * * /usr/local/bin/backup.sh

จะทำงานเวลา 15:30 น. ทุกวันหากเปิดเครื่อง ใช้ * * * * * ในขณะที่ทำการทดสอบให้ทำงานหนึ่งนาทีจนกว่าคุณจะทำงานได้


1
การใช้พา ธ สัมบูรณ์ในสคริปต์นั้นไม่สนับสนุน หากคุณไม่ทราบว่า PATH คืออะไรให้ตั้งค่าด้วยตัวคุณเองในสคริปต์ ดูเหตุผลที่ crontab ใช้งานไม่ได้
geirha

ลิงค์ที่มีประโยชน์ขอบคุณ เหตุผลที่กำหนดที่จะไม่ใช้เส้นทางแบบเต็มคือการพกพา ยุติธรรมพอสมควร อีกวิธีที่เหมาะสมคือการกำหนดคำสั่งที่คุณใช้เมื่อเริ่มต้นสคริปต์พร้อมกับการกำหนดค่าอื่น ๆ : LS = / bin / ls; SRC_DIR = / home / joe / src จากนั้นใช้ $ LS $ SRC_DIR เก็บทุกสิ่งที่กำหนดไว้ที่ด้านบนและในที่เดียว
Sean

ฉันพบว่าเพื่อลดความสามารถในการอ่านและคุณต้องผ่านคำสั่ง COMMAND = / path / to / ทุกคำสั่งสำหรับระบบใหม่ทุกอันที่ควรรัน ในระบบใดระบบหนึ่งคำสั่งทั้งหมดที่คุณต้องการอาจอยู่ใน / usr / bin และอีกคำสั่งหนึ่งอยู่ใน / bin ส่วนคำสั่งอื่นใน / usr / bin การมีทั้ง / usr / bin และ / bin ใน PATH ทำให้นั่นไม่ใช่ปัญหา ในหมายเหตุด้านชื่อตัวแปรควรเป็นตัวพิมพ์เล็กมิฉะนั้นคุณอาจเสี่ยงต่อการแทนที่ตัวแปรเชลล์พิเศษหรือตัวแปรสภาพแวดล้อม
geirha

Re: ชื่อตัวแปรตัวพิมพ์ใหญ่ ฉันทำมาโดยตลอดโดยไม่คิดมากเพราะสคริปต์แรกที่ฉันทำ แต่คุณถูกต้องไม่มีข้อเสียและโอกาสที่จะเกิดข้อเสีย ขอบคุณที่ชี้นำสิ่งนี้ให้เลิกนิสัยนี้ทันที
Sean

1

Greys syslog ของคุณสำหรับข้อความที่ชอบ;

crond: (*system*) BAD FILE MODE

ไฟล์จำเป็นต้อง จำกัด (เพียงพอ) ที่ 644):

chmod 0644 /etc/cron.d/my_crontab
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.