ตรวจสอบว่า /dev/sbd/
มีกำลังการผลิตถึง 90% ถ้าเป็นเช่นนั้น ให้ลบไฟล์ที่เก่าที่สุดใน (และไฟล์ในโฟลเดอร์ย่อย) /home/ben/ftp/เฝ้าระวัง/
และทำซ้ำเช่นนี้จนกว่า /dev/sbd/
ความจุต่ำกว่า 80% ทำซ้ำทุกๆ 10 นาที
สคริปต์ด้านล่างจะทำเช่นนั้น (โดยที่คุณเพิ่มลงในไฟล์ crontab
ให้ทำงานทุก ๆ 10 นาที) ตรวจสอบให้แน่ใจเป็นพิเศษว่านี่คือสิ่งที่คุณต้องการทำจริง ๆ เนื่องจากสิ่งนี้สามารถลบออกได้ง่าย ทั้งหมด ไฟล์ใน /home/ben/ftp/เฝ้าระวัง/
หากดิสก์ของคุณเต็มนอกไดเร็กทอรีนี้
#!/bin/sh
ไดเร็กทอรี = '/ home / ben / ftp / การเฝ้าระวัง'
max_usage=90
goal_usage=80
[ -d "ไดเรกทอรี $" ] || ทางออก 1
[ "$max_usage" -gt "$goal_usage" ] || ทางออก 1
[ "$( df --output=pcent $ไดเรกทอรี | \
grep -Ewo '[0-9]+' )" -ge "$max_usage" ] || ออก 0
dev_used="$( df -B 1K --output=us $directory | \
grep -Ewo '[0-9]+' )"
goal_usage="$( พิมพ์f "%.0f" \
$( echo ".01 * $goal_usage * \
$( df -B 1K --output=size $ไดเรกทอรี | \
grep -Ewo '[0-9]+' )" | bc ) )"
echo "$( find $directory -type f -printf '%Ts,%k,\047%p\047\n' )" | \
จัดเรียง -k1 | \
awk -F, -v เป้าหมาย="$(($dev_used-$goal_usage))" '\
(ผลรวม+$2)>เป้าหมาย{printf "%s ",$3; ทางออก} \
(ผลรวม+$2)<=เป้าหมาย{printf "%s ",$3}; {ผลรวม+=$2}' | \
xargs rm
สคริปต์นี้ทำงานอย่างไร:
3 บรรทัดแรกหลัง shebang คือตัวแปรตามพารามิเตอร์ของคุณ:
ไดเรกทอรี
เป็นพาธเต็มไปยังไดเร็กทอรีหลักที่มีไฟล์และไดเร็กทอรีย่อยที่คุณต้องการลบไฟล์เก่า (เช่น /home/ben/ftp/เฝ้าระวัง
). เครื่องหมายอัญประกาศรอบค่านี้ไม่จำเป็นเว้นแต่พาธจะมีช่องว่าง
max_usage
คือเปอร์เซ็นต์ของความจุของดิสก์ที่จะทริกเกอร์การดำเนินการลบไฟล์เก่า (กล่าวคือ 90
เปอร์เซ็นต์)
เป้าหมาย_การใช้งาน
คือเปอร์เซ็นต์ของความจุดิสก์ที่คุณต้องการได้รับหลังจากลบไฟล์เก่า (เช่น 80
เปอร์เซ็นต์)
โปรดทราบว่าค่าของ max_usage
และ เป้าหมาย_การใช้งาน
ต้องเป็น จำนวนเต็ม.
[ -d "ไดเรกทอรี $" ] || ทางออก 1
- ตรวจสอบว่า
ไดเรกทอรี
มีอยู่ มิฉะนั้นสคริปต์จะสิ้นสุดและออกด้วยสถานะ 1
[ "$max_usage" -gt "$goal_usage" ] || ทางออก 1
- ตรวจสอบว่า
max_usage
มีค่ามากกว่า เป้าหมาย_การใช้งาน
มิฉะนั้นสคริปต์จะสิ้นสุดและออกด้วยสถานะ 1
[ "$( df --output=pcent $ไดเรกทอรี | \
grep -Ewo '[0-9]+' )" -ge "$max_usage" ] || ออก 0
- รับเปอร์เซ็นต์ความจุของดิสก์ปัจจุบันที่ใช้และตรวจสอบว่าตรงตามหรือเกินเกณฑ์ที่กำหนดโดย
max_usage
. หากไม่มี ก็ไม่จำเป็นต้องดำเนินการเพิ่มเติม ดังนั้นสคริปต์จะสิ้นสุดและออกด้วยสถานะ 0
dev_used="$( df -B 1K --output=us $directory | \
grep -Ewo '[0-9]+' )"
- รับความจุของดิสก์ในปัจจุบันเป็นกิโลไบต์ที่ใช้
goal_usage="$( พิมพ์f "%.0f" \
$( echo ".01 * $goal_usage * \
$( df -B 1K --output=size $ไดเรกทอรี | \
grep -Ewo '[0-9]+' )" | bc ) )"
- แปลง
เป้าหมาย_การใช้งาน
ตัวแปรเป็นกิโลไบต์ (เราต้องการค่านี้ต่อไป)
ค้นหา $directory -type f -printf '%Ts,%k,\047%p\047\n'
- ค้นหาไฟล์ทั้งหมดใน
ไดเรกทอรี
(และในไดเร็กทอรีย่อยทั้งหมด) และสร้างรายการไฟล์เหล่านี้ หนึ่งรายการต่อบรรทัด โดยจัดรูปแบบเป็น การประทับเวลา, ขนาดเป็นกิโลไบต์, 'เต็ม/พาธ/ถึง/ไฟล์'
. โปรดทราบว่า 'เต็ม/เส้นทาง/ถึง/ไฟล์' อยู่ในเครื่องหมายอัญประกาศเดี่ยว ดังนั้นการเว้นวรรคในชื่อไฟล์หรือไดเร็กทอรีจะไม่ทำให้เกิดปัญหาในภายหลัง
เรียงลำดับ -k1
- เรียงลำดับก่อนหน้านี้
เสียงสะท้อน
'd รายการไฟล์ตามเวลาประทับ (เก่าที่สุดก่อน)
awk -F, -v เป้าหมาย="$(($dev_used-$goal_usage))"
อึดอัด
สร้างตัวแปรภายใน เป้าหมาย
นั่นเท่ากับผลต่างระหว่าง dev_used
และ เป้าหมาย_การใช้งาน
- และนี่คือมูลค่ากิโลไบต์ทั้งหมดของไฟล์ที่ต้องลบออกเพื่อให้เปอร์เซ็นต์ความจุของดิสก์ลดลงเหลือ เป้าหมาย_การใช้งาน
ตั้งไว้ที่จุดเริ่มต้นของสคริปต์
(ผลรวม+$2)>เป้าหมาย{printf "%s ",$3; ทางออก} \
(ผลรวม+$2)<=เป้าหมาย{printf "%s ",$3}; {ผลรวม+=$2}'
อึดอัด
(ต่อ) เริ่มประมวลผลรายการโดยเก็บผลรวมของค่าฟิลด์ 2 ไว้ (ขนาดเป็นกิโลไบต์) และฟิลด์การพิมพ์ 3 ค่า ('เต็ม/เส้นทาง/ถึง/ไฟล์') ไปยังสตริงที่คั่นด้วยช่องว่างจนกว่าผลรวมของกิโลไบต์จากฟิลด์ 2 จะมากกว่า เป้าหมาย
ซึ่ง ณ จุดนั้น อึดอัด
หยุดการประมวลผลบรรทัดเพิ่มเติม
xargs rm
- สตริงของค่า 'full/path/to/file' จาก
อึดอัด
ถูกส่งไปที่ xargs
ซึ่งเรียกใช้ rm
คำสั่งโดยใช้สตริงเป็นอาร์กิวเมนต์ สิ่งนี้จะลบไฟล์เหล่านั้น