ขั้นตอนทำงาน
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 สะดวก ปลอดภัย
สรุปหลักการทำงาน
- เมื่อบูตเครื่อง
➔ หลังจากระบบเสถียรแล้ว 5 นาทีclean-log-stream.service
จะถูกรัน - ทุกวันเวลา 03:00 AM
➔ จะรันclean-log-stream.service
อีกรอบ - ตัว 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