Logrotate: การหมุนไฟล์ที่ไม่ใช่บันทึกหรือไม่


17

ฉันมีสคริปต์สำรองที่บีบอัดไฟล์และไดเรกทอรีต่างๆและสร้างคลัง. tgz ชื่อไฟล์เช่น

...
backup_2010-10-28.tar.gz
backup_2010-10-29.tar.gz
backup_2010-10-30.tar.gz
backup_2010-10-31.tar.gz
backup_2010-11-01.tar.gz

ฉันต้องการจัดการไฟล์เหล่านี้ดังนั้นจึงมีเพียงการสำรองข้อมูล 5 ครั้งล่าสุดเท่านั้นเนื่องจากไฟล์เก่าถูกลบ

ฉันสามารถใช้ logrotate เพื่อทำสิ่งนี้ได้หรือไม่? พวกเขาไม่ได้ล็อกไฟล์และถูกบีบอัดแล้ว พวกเขาอยู่ใน / root และไม่อยู่ใน / var / log - ฉันยังสามารถใช้มันได้หรือไม่

ขอบคุณ

คำตอบ:


3

Logrotate หมุนไฟล์ดังนั้นคำตอบคือใช่ - อาจเป็นไปได้และหากไม่มีสิทธิ์เพียงพอให้วางไว้ใน / backup หรือบางสิ่ง ตรวจสอบกลุ่มและผู้ใช้ว่าบันทึกที่หมุนเวียนมี :-)

มีตัวเลือกสำหรับการบีบอัดใน logrotate ดังนั้นถ้า "บีบอัด" ไม่ได้รับการกำหนดค่า - ถ้าอย่างนั้นก็จะไม่พยายาม นอกจากนี้ในกรณีของคุณตัวเลือก "หมุน 5"

ดูที่ /etc/logrotate.d (หรือเก็บไว้ในระบบของคุณ)


26

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

อย่างไรก็ตามคุณสามารถทำให้มันเป็นไปตามที่คุณอธิบายตราบเท่าที่ข้อมูลสำรองล่าสุดถูกสร้างขึ้นโดยไม่มีการประทับวันที่ หากกระบวนการสำรองข้อมูลของคุณสร้าง/root/backup.tar.gzขึ้นคุณสามารถใช้การกำหนดค่า logrotate ต่อไปนี้:

/root/backup.tar.gz {
    rotate 5
    nocompress
    dateext
    dateformat _%Y-%m-%d
    extension .tar.gz
    missingok
}

บทสรุปของตัวเลือกอย่างรวดเร็วที่นี่:

  • rotate 5 - หมุน 5 ครั้งก่อนที่จะลบ
  • nocompress - อย่าบีบอัดไฟล์หลังจากหมุน
  • dateext - ใช้วันที่เป็นส่วนขยายการหมุนแทนการเพิ่มตัวเลข
  • dateformat _%Y-%m-%d - ตั้งค่ารูปแบบการขยายวันที่ที่คุณต้องการใช้
  • extension .tar.gz- ทำ.tar.gzมาหลังจากการขยายการหมุน
  • missingok - หากไฟล์ที่เราต้องการหมุนไม่ได้อยู่ที่นั่นอย่ากังวลและไปต่อ (ค่าเริ่มต้นคือการโยนข้อผิดพลาด)

หวังว่านี่จะช่วยได้!


1
ทำได้ดีมาก ฉันได้เรียนรู้สองสิ่งด้วยการอ่านสิ่งนี้ ฉันต้องการเพิ่มว่าการแจกแจงบางอย่างโดยเฉพาะ RedHat EL มีแนวโน้มที่จะตัดตัวเลือกที่ไม่ใช่ "Enterprise Ready" ดังนั้น YMMV
zerolagtime

stackoverflow.com/questions/14858752/วิธีการแก้ปัญหานี้ สามารถทำให้สำเร็จได้
ปีเตอร์

22

คุณไม่จำเป็นต้องใช้ logrotate เพียงใช้คำสั่งเช่นนี้:

ls -1 /root/backup_* | sort -r | tail -n +6 | xargs rm > /dev/null 2>&1

คำสั่งนี้จะปล่อยไฟล์ล่าสุด 5 ไฟล์และลบไฟล์ที่เหลือ (ถ้ามี) คุณสามารถใช้มันในงาน cron


แต่นี่จะไม่หมุน ....
simpleuser

ไม่ตอบคำถาม
kubanczyk

4
คำถามคือการสำรองข้อมูลล่าสุดห้ารายการซึ่งทำเช่นนั้นทุกประการ ง่ายยิ่งขึ้น: ls -t1 / root / backup_ * | tail -n +6 | xargs rm -f
yoyoma2

สิ่งนี้ตอบคำถามของฉัน น่าเศร้าที่คำถามดั้งเดิมคือคำถามที่ใกล้เคียงที่สุดที่ฉันสามารถหาได้ด้วย Google-fu
Sukima

0

ฉันเพิ่งมีสถานการณ์เดียวกัน Logrotate ฟังดูเท่มาก แต่มันไม่ได้ผลสำหรับฉันที่ 100% เพราะมันไม่ตรงกับข้อมูลและชื่อไฟล์

ดังนั้นเพื่อหลีกเลี่ยงความสับสนฉันตัดสินใจที่จะรวมบรรทัดต่อไปนี้เพื่อดำเนินการหลังจากสร้างการสำรองข้อมูลปัจจุบันของฉันเพื่อเก็บสำรองข้อมูล 5 ครั้งล่าสุด

บันทึกของฉันคือ:

  • tbl-BCX-20180308_010501.tar.bz2
  • tbl-BCX-20180307_010501.tar.bz2
  • tbl-BCX-20180306_010501.tar.bz2

บรรทัดใหม่ในสคริปต์สำรองของฉัน (ตามความคิดเห็นด้านบน)

  • find / BCX / dumpsql / -type f | เรียง -r | tail -n +6 | xargs rm

ความนับถือ,


-1

คุณสามารถหมุนด้วยตนเอง

rotating_logger()
{

_LOG_FILE_=${1}
_MESSAGE_TO_ECHO_=${2}

_LOG_FILE_BYTES_SIZE_=`wc -c ${_LOG_FILE_} | awk '{print $1}'`

#echo "_LOG_FILE_BYTES_SIZE_ : ${_LOG_FILE_BYTES_SIZE_}"

# in MB
if [ ${_LOG_FILE_BYTES_SIZE_} -gt ${_FILE_SIZE_IN_BYTES_} ] ; then
        #cat /dev/null > ${_LOG_FILE_}
         for (( i=${_LOG_ROTATE_MAX_INDEX_}; i>=1; i-- ))
        do
                 if [ $i -eq ${_LOG_ROTATE_MAX_INDEX_} -a -f ${_LOG_FILE_}.$i ] ; then
                        rm -rf ${_LOG_FILE_}.$i
                 fi

                if [ $i -gt 10 ] ; then
                        rm -rf ${_LOG_FILE_}.10
                elif [ $i -eq 9 -a -f ${_LOG_FILE_}.9 ] ; then
                       mv ${_LOG_FILE_}.9 ${_LOG_FILE_}.10
                elif [ $i -eq 8 -a -f ${_LOG_FILE_}.8 ] ; then
                       mv ${_LOG_FILE_}.8 ${_LOG_FILE_}.9
                elif [ $i -eq 7 -a -f ${_LOG_FILE_}.7 ] ; then
                       mv ${_LOG_FILE_}.7 ${_LOG_FILE_}.8
                elif [ $i -eq 6 -a -f ${_LOG_FILE_}.6 ] ; then
                       mv ${_LOG_FILE_}.6 ${_LOG_FILE_}.7
                elif [ $i -eq 5 -a -f ${_LOG_FILE_}.5 ] ; then
                       mv ${_LOG_FILE_}.5 ${_LOG_FILE_}.6
                elif [ $i -eq 4 -a -f ${_LOG_FILE_}.4  ] ; then
                       mv ${_LOG_FILE_}.4 ${_LOG_FILE_}.5
                elif [ $i -eq 3 -a -f ${_LOG_FILE_}.3  ] ; then
                       mv ${_LOG_FILE_}.3 ${_LOG_FILE_}.4
                elif [ $i -eq 2 -a -f ${_LOG_FILE_}.2  ] ; then
                       mv ${_LOG_FILE_}.2 ${_LOG_FILE_}.3
                elif [ $i -eq 1 -a -f ${_LOG_FILE_}.1 ] ; then
                       mv ${_LOG_FILE_}.1 ${_LOG_FILE_}.2
                fi
        done
        mv ${_LOG_FILE_} ${_LOG_FILE_}.1
        touch ${_LOG_FILE_}
fi

echo `date +%Y-%m-%d:%H:%M:%S` : "${_MESSAGE_TO_ECHO_}" >> ${_LOG_FILE_}
#echo "" >> ${_LOG_FILE_}
}

ตอนนี้จะนำข้อมูลไปสู่บันทึกเพียงแค่ทำ

rotating_logger <file_path> "Welcome world!"

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