สร้าง Shell Script สำหรับลบไฟล์ .log ในแฟ้มย่อย CentOS9


ขั้นตอนทำงาน

1. สร้าง Shell Script สำหรับลบไฟล์ .log

sudo nano /usr/local/bin/clean-log-stream.sh

ตัวอย่างเนื้อหา

#!/bin/bash

# ลบไฟล์ .log ที่เก่ากว่า 5 วัน รวมถึงในแฟ้มย่อยทั้งหมด
find /var/www/html/mill-app.com/stream -type f -name "*.log" -mtime +5 -exec rm -f {} \;

บันทึกแล้วให้สิทธิ์รัน

sudo chmod +x /usr/local/bin/clean-log-stream.sh

2. สร้าง Systemd Service

sudo nano /etc/systemd/system/clean-log-stream.service

ตัวอย่างเนื้อหา

[Unit]
Description=Clean old log files in stream folder
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/clean-log-stream.sh

3.ตั้งให้รันทุกครั้งที่บูต (ผ่าน systemd)

สร้าง Timer:

sudo nano /etc/systemd/system/clean-log-stream.timer

ตัวอย่างเนื้อหา

[Unit]
Description=Run clean-log-stream.service at boot

[Timer]
OnBootSec=5min
AccuracySec=1min

[Install]
WantedBy=timers.target

อธิบาย

  • OnBootSec=5min ➔ ให้รันหลังจากบูตเครื่อง 5 นาที
  • ปรับเวลาได้ตามต้องการ

4.เปิดใช้งาน Timer

sudo systemctl daemon-reload
sudo systemctl enable clean-log-stream.timer
sudo systemctl start clean-log-stream.timer

5.ตรวจสอบว่า Timer ทำงาน

systemctl list-timers --all | grep clean-log-stream

สรุป

✅ ลบไฟล์ .log ที่เก่ากว่า 5 วันใน /var/www/html/mill-app.com/stream
✅ ครอบคลุมทุกแฟ้มย่อย
✅ รันอัตโนมัติหลังบูตทุกครั้ง
✅ ใช้ systemd แบบปลอดภัยและมีการควบคุม

ตัวเลือกเสริม

ถ้าอยากให้ลูปทำงานทุกวันอัตโนมัติ เพิ่มใน Timer ได้ เช่น

OnCalendar=daily

ขั้นตอนละเอียด

1.สร้าง Shell Script

sudo nano /usr/local/bin/clean-log-stream.sh

เนื้อหา

#!/bin/bash

# ลบไฟล์ .log ที่เก่ากว่า 5 วัน รวมถึงในแฟ้มย่อยทั้งหมด
find /var/www/html/mill-app.com/stream -type f -name "*.log" -mtime +5 -exec rm -f {} \;

ให้สิทธิ์รัน

sudo chmod +x /usr/local/bin/clean-log-stream.sh

2.สร้าง Service

sudo nano /etc/systemd/system/clean-log-stream.service

เนื้อหา

[Unit]
Description=Clean old log files in stream folder
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/clean-log-stream.sh

3.สร้าง Timer

sudo nano /etc/systemd/system/clean-log-stream.timer

เนื้อหา

[Unit]
Description=Run clean-log-stream.service daily and at boot

[Timer]
# รันหลังจากบูตเครื่อง 5 นาที
OnBootSec=5min

# รันทุกวันเวลา 03:00 AM (ปรับเวลาได้ตามต้องการ)
OnCalendar=*-*-* 03:00:00

# ปรับความแม่นยำของเวลา
AccuracySec=1min

[Install]
WantedBy=timers.target

4.โหลดและเปิดใช้งาน

sudo systemctl daemon-reload
sudo systemctl enable clean-log-stream.timer
sudo systemctl start clean-log-stream.timer

5.ตรวจสอบ Timer

systemctl list-timers --all | grep clean-log-stream

จะเห็นตารางเวลารันของ Timer

สรุป:

✅ ลบไฟล์ .log ที่เก่ากว่า 5 วันใน /var/www/html/mill-app.com/stream
✅ ครอบคลุมทุกแฟ้มย่อย
✅ รันทุกวันตอนตี 3
✅ รันหลังบูตเครื่อง 5 นาที
✅ ควบคุมผ่าน systemd สะดวก ปลอดภัย

สรุปหลักการทำงาน

  1. เมื่อบูตเครื่อง
    ➔ หลังจากระบบเสถียรแล้ว 5 นาที clean-log-stream.service จะถูกรัน
  2. ทุกวันเวลา 03:00 AM
    ➔ จะรัน clean-log-stream.service อีกรอบ
  3. ตัว Timer เองทำงานเบื้องหลัง systemd
    ➔ ไม่ต้องใช้ cron

🔗 การโยงระหว่าง .timer และ .service

ในระบบ systemd:

✅ ถ้าไฟล์ .timer กับไฟล์ .service
ตั้งชื่อเหมือนกันตรงหน้า .timer และ .service
ระบบจะเชื่อมโยงให้อัตโนมัติ

ตัวอย่างของเรา:

  • Timer ชื่อ clean-log-stream.timer
  • Service ชื่อ clean-log-stream.service

✨ systemd รู้โดยอัตโนมัติว่า

clean-log-stream.timer จะไปสั่ง clean-log-stream.service ทำงานเมื่อถึงเวลา

ตัวอย่างลำดับการทำงานจริง

1.ถึงเวลาที่กำหนดใน clean-log-stream.timer เช่น

  • หลังบูต 5 นาที (จาก OnBootSec=5min)
  • หรือทุกวัน 03:00 AM (จาก OnCalendar=*-*-* 03:00:00)

2.systemd จะ “ไปเรียก”

systemctl start clean-log-stream.service

3.ซึ่งเนื้อหาใน clean-log-stream.service คือ

[Service]
Type=oneshot
ExecStart=/usr/local/bin/clean-log-stream.sh

หมายถึงสั่งให้ /usr/local/bin/clean-log-stream.sh รัน 1 รอบ แล้วจบ

📌 สรุป:

  • ไม่มีการระบุชื่อ Service ซ้ำในไฟล์ .timer
  • systemd ใช้หลัก “ชื่อไฟล์เดียวกัน” เป็นตัวเชื่อม
  • ถ้าอยากให้ Timer สั่งรัน Service อื่น ให้ตั้งชื่อให้ตรงกัน หรือใช้ Unit= ระบุ Service ที่จะสั่งชัดเจน (กรณีชื่อไม่ตรง)

ตัวอย่างขั้นสูง (ไม่ตั้งชื่อให้ตรง)

ถ้าอยากให้ Timer สั่งรัน Service อื่น เช่น:

[Timer]
OnBootSec=5min
Unit=my-other-cleaner.service

แบบนี้ my-other-cleaner.service จะถูกเรียกแทน

สรุปง่ายสุด:

ตอนนี้ clean-log-stream.timer และ clean-log-stream.service ชื่อเหมือนกัน
ระบบจึงโยงให้เอง ไม่ต้องตั้งอะไรเพิ่ม

ถ้าอยากลองดูว่า Timer รันล่าสุดเมื่อไหร่ ใช้:

systemctl list-timers --all | grep clean-log-stream

, ,