ทำไม CentOS logrotate ของฉันถึงทำงานแบบสุ่ม?


10

ฉันใส่logrotateไฟล์การกำหนดค่า/etc/logrotate.d/และคาดว่าบันทึกจะหมุนในเวลาที่สอดคล้องกัน อย่างไรก็ตามพวกเขาไม่ ... เวลาการหมุนของบันทึกจะสุ่ม +/- หนึ่งชั่วโมง

เหตุใดการหมุนของบันทึกจึงเริ่มต้นขึ้นแบบสุ่มและฉันจะเปลี่ยนสิ่งนี้ได้อย่างไร


ข้อมูล: ไฟล์กำหนดค่า logrotate ของฉันมีลักษณะเช่นนี้ ...

/opt/backups/network/*.conf {
        copytruncate
        rotate 30
        daily
        create 644 root root
        dateext
        maxage 30
        missingok
        notifempty
        compress
        delaycompress
        postrotate
            ## Create symbolic links in daily/
            PATH=`/usr/bin/dirname $1`;
            FILE=`/bin/basename $1`;
            /bin/ln -s $1 $PATH/daily/$FILE
        endscript
}

คำตอบ:


10

กุญแจสำคัญคือการรู้ว่า CentOS เรียกใช้สคริปต์ใน /etc/cron.{daily,weekly,monthly} จากanacron... /etc/anacrontabคือการตั้งค่าRANDOM_DELAYซึ่งทำในสิ่งที่คุณคาดหวัง (มันจะล่าช้าถึงRANDOM_DELAYนาทีก่อนที่จะเริ่มงาน) ...

# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

#period in days   delay in minutes   job-identifier   command
1       5       cron.daily              nice run-parts /etc/cron.daily
7       25      cron.weekly             nice run-parts /etc/cron.weekly
@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly

การตั้งค่าRANDOM_DELAY=0/ START_HOURS_RANGE=3แก้ไขปัญหา ...

แก้ไข

หลังจากคิดเพิ่มเติมฉันจะลบanacronและติดตั้งจิ้งจอกปกติcron...


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

การตั้งค่า START_HOURS_RANGE เป็นค่าเดียว (= 3) จะไม่ทำงานเนื่องจาก var นี้คาดว่าจะเป็นช่วงไม่ใช่หมายเลขเดียว ดังนั้นควรเป็น 3-4 ในตัวอย่างด้านบน
Slavik

6

ไม่ใช่คำตอบ แต่เมื่อเร็ว ๆ นี้ฉันพยายามหาเหตุผลอื่นและไม่พบเอกสารใด ๆ เกี่ยวกับวิธี Redhat 6, Centos และอื่น ๆ เรียกใช้ cron นี่คือสิ่งที่ฉันออกแบบวิศวกรรมย้อนกลับ:

  1. crond ยังคงทำงานเมื่อเริ่มต้นระบบ - โหลดไฟล์ทั้งหมดใน /etc/cron.d
  2. /etc/cron.d/0hourly รันไฟล์ทั้งหมดใน /etc/cron.hourly
  3. /etc/cron.hourly/0anacron วิ่ง anacron
  4. โหลด anacron /etc/anacrontab
  5. /etc/anacrontabวิ่ง (ผ่านrun-parts) /etc/cron.daily, /etc/cron.weeklyและ/etc/cron.monthly

ดังนั้นมันจึงซับซ้อนกว่าในเวอร์ชันก่อนหน้า

เป็นไปได้ที่จะกู้คืนพฤติกรรมเก่าโดยเพิ่มรายการรายชั่วโมงรายสัปดาห์และรายเดือนกลับเข้าไปใน/etc/crontab(ซึ่งตอนนี้ว่างเปล่า) แต่anacrontabจะต้องได้รับการอัปเดตด้วย สิ่งนี้อาจจะหรืออาจจะไม่อัพเดทในอนาคต ...


4

คำตอบอื่น ๆ ครอบคลุมวิธีการแต่ไม่จำเป็นว่าทำไม เหตุผลคือเพื่อให้พร้อมกันงาน cron คืนจากการฆ่าโครงสร้างพื้นฐานของคุณ (ลองนึกภาพที่เก็บข้อมูลที่ใช้ร่วมกันหรืออาจเป็นเซิร์ฟเวอร์ 1,000 เครื่องที่ทำงานบนโฮสต์ VM หนึ่งเครื่องหรือเพียงแค่งานคืนที่กระทบกับบริการเครือข่ายบางส่วน)

ฉันมักจะแก้ปัญหานี้สำหรับการหมุนเข้าสู่ระบบที่เฉพาะเจาะจงในระบบของฉันโดยการย้ายงานล็อกการหมุนที่เฉพาะเจาะจงจากการเข้าสู่ธุรกิจที่มีช่วงเวลาที่ยากรหัสในcron.daily cron.dด้วยวิธีนี้คุณยังคงได้รับการเรียกใช้ที่ถูกต้องสำหรับบริการอย่างเช่น updatedb โดยที่เวลาไม่จำเป็นจริง ๆ แต่เป็นเวลาที่สอดคล้องกันสำหรับการหมุนเวียนบันทึก

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

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