ความแตกต่างระหว่างการใช้ crontab และ /etc/cron.hourly,daily,weekly


12

ฉันมีสคริปต์ที่กำหนดเวลาไว้ซึ่งสำรองข้อมูล svnsync รายชั่วโมงของที่เก็บข้อมูลการโค่นล้มของเรา ฉันเรียกใช้จากรายการใน root crontab โดยไม่มีปัญหา แต่ตัดสินใจว่าฉันต้องการรันจาก /etc/cron.hourly แทนเพื่อการมองเห็นพิเศษ (และเนื่องจากวิศวกรคนหนึ่งของเราลบ crontab โดยบังเอิญเพราะเขาคิดว่า "crontab" -r "แปลว่า" อ่าน crontab ;-))

คำสั่ง svnsync ในสคริปต์ cron.hourly ล้มเหลวโดยมีข้อความแจ้งว่าต้องยอมรับใบรับรอง SSL สำหรับที่เก็บ SVN (นี่คือข้อความที่คุณได้รับแบบโต้ตอบในครั้งแรกที่ผู้ใช้เข้าถึงที่เก็บ SVN แต่เมื่อใบรับรองฉัน ยอมรับข้อความไม่ขึ้นมาอีก)

สำหรับฉันแล้วดูเหมือนว่าสคริปต์จะถูกดำเนินการภายใต้สภาพแวดล้อมผู้ใช้ที่แตกต่างกันเมื่อเรียกใช้จาก cron.hourly กว่าเมื่อมันทำงานผ่านรูท crontab มีใครอธิบายความแตกต่างได้บ้าง

UPDATE: ฉันควรจะพูดถึง distro ของฉันฉันใช้ anacron กับ CentOS 5.1

ปรับปรุง 2: ขอบคุณสำหรับคำแนะนำจนถึง; ฉันคิดว่านี่กลายเป็นคำถามการโค่นล้มมากขึ้น ฉันพยายามที่จะห่อหุ้มสภาพแวดล้อมของฉันลงในสคริปต์ของฉันเสมอ แต่ปัญหาที่นี่คือฉันไม่แน่ใจว่ามันอยู่ในสภาพแวดล้อมที่ทำให้ SVN ขอใบรับรอง SSL ที่จะยอมรับเมื่อฉันเรียกใช้สคริปต์จาก cron.hourly ฉันเดาว่ามันเป็นเรื่องเกี่ยวกับวิธีการเรียกใช้งานสคริปต์ของส่วนทำงาน


1
มันจะมีประโยชน์ในการรวมแพ็คเกจ distro และ cron ของคุณ
Dan Carley

คำตอบ:


4

คุณต้องการใช้ตัวเลือก '--config-dir' เพื่อแจ้งให้ทราบว่าจะหาใบรับรองที่ยอมรับได้ (เช่น ~ / .subversion โดยค่าเริ่มต้น)

ที่กล่าวว่าฉันเกือบบางอย่างที่คุณต้องการจะดีกว่าการเรียก svnsync จากตะขอ / หลังกระทำสคริปต์แทนเป็นปัญหาอื่น ๆ จากนั้นมิเรอร์ของคุณจะซิงค์อยู่เสมอแทนที่จะซิงค์กับตำแหน่งที่เจ้านายของคุณอยู่เมื่อหนึ่งชั่วโมงก่อน


16

บนระบบ Debian / Ubuntu cron.daily | Week | montly เริ่มจาก crontab หลัก

17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

โปรดทราบว่าคุณอาจวางส่วน crontab ใน /etc/cron.d/

อย่างที่คุณเห็นไม่มีอะไรพิเศษเป็นพิเศษเกี่ยวกับสภาพแวดล้อมนี้ อย่างน้อยใน Debian / Ubuntu ทุกอย่างจะถูกเรียกใช้เป็นบัญชีรูท

เมื่อฉันเขียนสคริปต์ cron ที่จุดเริ่มต้นของสคริปต์ฉันมักจะตั้งค่า PATH และตัวแปรสภาพแวดล้อมอื่น ๆ ที่ฉันจะใช้ดังนั้นฉันจึงมั่นใจได้ว่ามันจะทำงานได้อย่างถูกต้องในทุกสภาพแวดล้อม


6

crontab ทั้งระบบปกติเป็น crontab /etc/crontabผู้ใช้เฉพาะและมีข้อมูลชื่อผู้ใช้ที่ใช้โดย

การใช้สคริปต์ใน/etc/cron.*(รายชั่วโมงรายวันรายสัปดาห์รายเดือน) เป็นวิธีที่สะอาดและง่ายกว่า (ป้องกันข้อผิดพลาดทางไวยากรณ์ทั่วไป) ของการกำหนดค่า crontab สำหรับrootผู้ใช้และสิ่งนี้ถูกจัดการโดยrun-partsที่เรียกใช้สคริปต์หรือโปรแกรมในไดเรกทอรี กฎทั้งหมดเหล่านี้ยังคงถูกกำหนดใน crontab ทั่วทั้งระบบโดยค่าเริ่มต้น ( /etc/crontab) ดังนั้นจึงเป็นสิ่งเดียวกัน

เมื่องาน cron ถูกจัดการโดยrun-partsง่ายต่อการดีบักเนื่องจากคุณสามารถทดสอบว่าสคริปต์ใดที่จะทำงานอย่างแน่นอน (โดยไม่ต้องเรียกใช้งาน) โดย:

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

3

การคาดเดาครั้งแรกของฉันจะตรวจสอบตัวแปร HOME ของคุณ

ในระบบ Centos ของฉัน man 5 crontab พูดว่า:

ตัวแปรสภาวะแวดล้อมหลายตัวถูกตั้งค่าโดยอัตโนมัติโดย cron (8) daemon SHELL ถูกตั้งค่าเป็น / bin / sh และ LOGNAME และ HOME ถูกตั้งค่าจากบรรทัด / etc / passwd ของเจ้าของ crontab

ดังนั้นหากคุณไม่ได้ระบุมิฉะนั้น crontab ของรูทจะใช้ / root สำหรับ HOME แต่ใน / etc / crontab (ซึ่งเป็นที่ /etc/cron.hourly จะถูกเรียกใช้ผ่านทาง run-parts) HOME ถูกตั้งค่าเป็น / (และ SHELL เป็น / bin / bash แทน / bin / sh)

ฉันไม่ทราบเกี่ยวกับ svnsync แต่การโค่นล้มใช้ไดเรกทอรี ˜ / .subversion / เพื่อที่จะขึ้นอยู่กับหน้าแรก


3

บนระบบ RHEL 5.1 ของฉันตัวแปรสภาพแวดล้อม PATH ถูกตั้งค่าจาก / etc / crontab สิ่งที่อยู่ด้านบนทั้งหมดคือสิ่งที่ถูกป้อนเข้าสู่สภาพแวดล้อม

หากคุณรีสตาร์ท cron แล้วครั้งแรกที่มันทำงาน (ถ้ามาจาก/etc/crontabหรือ/var/spool/cron/$USER) มันจะทำการบันทึกไว้ใน / var / log / cron มิฉะนั้นจะสังเกตได้ว่า

crontab ของฉันถูกตั้งค่าเป็น:

01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

สิ่งที่คุณสามารถทำได้คือใส่สิ่งต่อไปนี้ลงใน /etc/cron.hourly:

env > /tmp/cron.env

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


2

/var/log/messages (หรือเทียบเท่าของ distro ของคุณ) ควรบอกคุณเฉพาะของคำสั่งอะไรถูกเรียกใช้เมื่อใดและเป็นผู้ใช้ใด


2

อย่าคิดเลยว่ามีอะไรในสิ่งแวดล้อม รหัสเสมอป้องกัน คุณมีไฟล์ทั้งหมดที่จะนำสภาพแวดล้อมการตั้งค่าสิ่งที่คุณต้องการมี ใช้มัน.


2

การพกพาไม่มากนักครั้งสุดท้ายที่ฉันตรวจสอบ (ใน Debian) ก็แนะนำให้ใส่สิ่งของใน cron.hourly (และอื่น ๆ ) และไม่เข้า crontab โดยตรงหากคุณต้องการสร้างแพ็คเกจด้วยสิ่งของของคุณ

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