ทำไม crontab ของฉันถึงไม่เรียก?


29

ฉันเคยcrontab -eเพิ่มบรรทัดต่อไปนี้ใน crontab ของฉัน:

* * * * * echo hi >> /home/myusername/test

แต่ฉันไม่เห็นว่าไฟล์ทดสอบถูกเขียนไป นี่เป็นปัญหาสิทธิ์หรือ crontab ทำงานไม่ถูกต้องหรือไม่

ฉันเห็นว่ากระบวนการ cron กำลังทำงานอยู่ ฉันจะแก้ไขข้อบกพร่องนี้ได้อย่างไร

แก้ไข - ถาม Ubuntu มีคำถามที่ดีเกี่ยวกับ crontabแต่น่าเสียดายที่ยังไม่ช่วยฉัน

แก้ไข 2 - อืมดูเหมือนว่าไฟล์ทดสอบของฉันมี 214 บรรทัดซึ่งหมายความว่าในช่วง 214 นาทีที่ผ่านมามันถูกเขียนไปทุกนาที ฉันไม่แน่ใจว่าปัญหาคืออะไร แต่มันหายไปอย่างชัดเจน

คำตอบ:


23

มีการติดตั้งใช้งานcron(ไม่ใช่ทั้งหมดและฉันจำไม่ได้ว่าเป็นมือเดียว แต่ฉันเจอหนึ่งใน Linux) ที่ตรวจสอบไฟล์ crontab ที่อัปเดตทุกนาทีในนาทีและไม่พิจารณารายการใหม่จนกว่าจะถึงนาทีถัดไป . ดังนั้น crontab อาจใช้เวลาถึงสองนาทีในการลุกขึ้นในครั้งแรก นี่อาจเป็นสิ่งที่คุณสังเกตเห็น


1
ฉันเดาโซลาริสหรือโซลาริสเร็ว ฉันมีนิสัยที่จะทำให้รายการ cron รันได้ในอนาคตในเวลา 3-5 นาทีเมื่อฉันทดสอบสคริปต์จากรายการ crontab เพราะฉันเคยถูกหลอกโดยพฤติกรรมนี้ตลอดเวลา
Bruce Ediger

fcronทำเช่นนี้ด้วย
phunehehe

จะเกิดอะไรขึ้นถ้ารูทีน "ตรวจสอบ" มีค่าใช้จ่ายเกินสองสามนาที จะมี cronjobs ที่ควรถูกเรียกใช้ในระหว่างนี้ "ตรวจสอบ" ยาวที่ไม่ได้ถูกเรียก
ospider

@ospider การตรวจสอบใช้เวลาเพียงเสี้ยววินาที
Gilles 'SO- หยุดความชั่วร้าย'

28

มีบรรทัดว่างหลังจาก cronjob ของฉัน
ripper234

4
ไม่ใช่บรรทัดว่าง แต่ขึ้นบรรทัดใหม่ที่ท้ายบรรทัดสุดท้าย ไฟล์ข้อความควรประกอบด้วยลำดับของบรรทัดแต่ละบรรทัดถูกยกเลิกโดยการขึ้นบรรทัดใหม่ดังนั้นไฟล์ข้อความที่ไม่ว่างจะลงท้ายด้วยอักขระขึ้นบรรทัดใหม่ ยูทิลิตี้บางอย่างไม่ได้ประมวลผลอะไรหลังจากขึ้นบรรทัดใหม่ในไฟล์
Gilles 'หยุดความชั่วร้าย'

1
นี่คือคำถามของคำว่า "ตัวอักษรขึ้นบรรทัดใหม่" หมายถึง "หลังจากตัวละครนี้เริ่มบรรทัดใหม่ของข้อความ" ดังนั้น 0 ไบต์ระหว่างการขึ้นบรรทัดใหม่ล่าสุดและ EOF อาจถูกพิจารณาว่าเป็นบรรทัดว่าง ("บรรทัดที่มี 0 อักขระ")
gelraen

10

ฉันมีปัญหาเดียวกัน - crontab ที่ใช้งานได้หยุดลงทันทีหลังจากฉันเพิ่มรายการใหม่ในตอนท้าย ปรากฎว่าฉันลืมใส่บรรทัดใหม่หลังจากบรรทัดสุดท้าย

ฉันพบโดยการออกคำสั่ง

cat /var/log/syslog | grep crontab

และผลลัพธ์ที่แสดงให้เห็นปัญหา:

Jul  2 08:16:01 shiva cron[1254]: (*system*) RELOAD (/etc/crontab)
Jul  2 08:16:01 shiva cron[1254]: (*system*) ERROR (Missing newline before EOF, this crontab file will be ignored)

การเพิ่มบรรทัดใหม่และการบันทึกช่วยแก้ปัญหาได้


5

เสียงเช่นนี้ได้รับการแก้ไข ครั้งต่อไปให้ลองบันทึก STDERR เช่นกัน ต่อไปนี้จะเข้าสู่ระบบ STDOUT เท่านั้นไม่ใช่ STDERR:

* * * * * echo hi >> /home/myusername/test

ลองตรวจสอบให้แน่ใจว่ามีส่วนคำสั่งที่ชัดเจนสำหรับ STDERR เช่นกัน มิฉะนั้นอาจส่ง STDERR ผ่านอีเมลไปยังผู้ใช้ (สมมติว่าอีเมลทำงาน) หรืออาจไปที่ใดก็ได้ขึ้นอยู่กับการกำหนดค่า Cron

* * * * * echo hi >> /home/myusername/test 2> /home/myusername/test.stderr

การตั้งค่าของฉันคือการส่งออก cronjob ไปยัง syslog ด้วยวิธีนี้ฉันใช้ประโยชน์จากโครงสร้างพื้นฐาน syslog ใด ๆ ที่มีอยู่ (syslogs รวมศูนย์, Splunk, การหมุนบันทึกได้รับการสนับสนุนแล้วมันง่ายต่อการเปรียบเทียบข้อความใน / var / log / ข้อความ & / var / log / cronjob ฯลฯ ) และฉันไม่ สแปม sysadmins (ฉัน) ด้วยอีเมลที่ไม่จำเป็น

* * * * * echo hi >> /home/myusername/test 2>&1 | /usr/bin/logger -t mycronjob

2

สำหรับฉันปัญหาคือว่าสคริปต์ไม่สามารถเรียกใช้งานได้ ฉันมีการติดตั้งcrontab -eเช่นนี้

* * * * * /bin/my-script.sh

และไฟล์ myscript นั้นไม่สามารถเรียกใช้งานได้ดังนั้นฉันจึงรัน

chmod +x my-script.sh

ทันทีที่ฉันเริ่มเห็นผลลัพธ์ตามที่คาดไว้


1

สาย cron ของคุณทำงานได้ดีบนคอมพิวเตอร์ของฉันเมื่อฉันเปลี่ยนไปmyusernae phuneheheมีหลายวิธีในการค้นหาว่ามีอะไรผิดปกติกับระบบของคุณ

Cron มักจะส่งจดหมายไปยังผู้ใช้เมื่อมีสิ่งผิดปกติ ถ้าคุณเห็นข้อความ "คุณมีจดหมาย" ใช้โปรแกรมอีเมลไปตรวจสอบกล่องจดหมายของคุณ หรือตรวจสอบในไดเรกทอรีบ้านของคุณอาจมีชื่อไฟล์dead.letterอยู่ที่นั่น

คุณสามารถตรวจสอบ/var/log/รายการที่เกี่ยวข้องกับ cron ในคอมพิวเตอร์ของฉันไฟล์บันทึกเป็นที่/var/log/cron/current(ต้องมีการเข้าถึงรูท)

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

killall fcron
fcron --foreground --debug

ฉันจะค้นหาชื่อภูตของฉันได้อย่างไร
ripper234

ใช้ @ ripper234 ps -ef | grep cronและคุณควรเห็นบรรทัดสำหรับ cron ของคุณ ตรวจสอบ man page ของ cron เพื่อดูค่าสถานะสำหรับการดีบัก เป็นไปได้ว่าคุณกำลังใช้Vixie Cron-xในกรณีที่ธงแก้ปัญหาคือ ฆ่ากระบวนการ cron และเริ่มต้นอีกครั้งด้วยการตั้งค่าสถานะเพิ่มเติม
phunehehe

ตรวจสอบ / var / log / syslog ด้วย ในกรณีของฉันมีคำเตือนว่าไฟล์ cron สามารถเขียนเป็นกลุ่มได้
รักษา mods ของคุณดี

1

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

วิธีที่ดีในการรับข้อผิดพลาดของ crontab ผ่านอีเมลคือการทำให้ crontab ของคุณมีลักษณะดังนี้:

MAILTO="myemail@example.com"
* * * * * echo hi >> /home/myusernae/test

เห็นได้ชัดว่าใช้ที่อยู่อีเมลของคุณแทนที่จะเป็น myemail@example.com สิ่งนี้จะบอก cron ให้ส่งข้อผิดพลาดไปยังที่อยู่อีเมลของคุณแทนที่จะเป็นบัญชีท้องถิ่น โดยเฉพาะอย่างยิ่งสิ่งนี้มีประโยชน์หากคุณมี root crontab (หรือส่วน crontab ใน /etc/cron.d) ที่คุณต้องการเพียงแค่ส่งผลลัพธ์ให้คุณคุณสามารถหลีกเลี่ยงกล่องจดหมายของ root หรือที่อยู่ส่งต่อของราก


ฉันไม่ทราบว่าระบบมีการกำหนดค่าเซิร์ฟเวอร์อีเมล SMTP / ขาออกหรือไม่ อัตราต่อรองที่มันไม่ได้
ripper234

1

ฉันเดาว่าเหตุผลข้อหนึ่งอาจเป็นเพราะไดเรกทอรี / home / ถูกเข้ารหัสและเมื่อผู้ใช้ออกจากระบบ cron ไม่สามารถทำอะไรในไดเรกทอรีนั้น

ดู: https://stackoverflow.com/a/40354269/1279002

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