Tóm tắt: Cron chạy job với môi trường tối giản (SHELL=/bin/sh, PATH=/usr/bin:/bin, không đọc .bashrc) nên lỗi phổ biến nhất là "chạy tay được, cron thì không". Logrotate trên Ubuntu 22.04 được gọi mỗi ngày bởi logrotate.timer (systemd), đọc /etc/logrotate.conf + /etc/logrotate.d/*. Luôn thử config mới bằng logrotate -d (không thay đổi gì). Job mới cần log, retry, phụ thuộc service thì cân nhắc systemd timer.
flowchart LR
A["crontab -e (user)"] --> C["cron daemon"]
B["/etc/cron.d/* (có cột user)"] --> C
C -->|"mỗi phút so lịch"| D["/bin/sh -c 'lệnh'"]
D --> E["output: mail hoặc file log"]
T["logrotate.timer (daily)"] --> L["logrotate /etc/logrotate.conf"]
L --> R["/etc/logrotate.d/myapp"]
R --> S["rotate, compress, postrotate"]
SHELL=/bin/bashPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binMAILTO=""# m h dom mon dow user command15 1 * * * netops flock -n /tmp/netbackup.lock /opt/netbackup/run.sh >> /var/log/netbackup/run.log 2>&1
flock -n: lần chạy trước chưa xong thì bỏ qua, tránh chồng job.
Redirect >> ... 2>&1: không có thì output gửi mail (thường mất nếu không có MTA).
Ký tự % trong lệnh cron là xuống dòng; phải viết \%, ví dụ date +\%F.
File trong /etc/cron.d/ và /etc/cron.daily/: tên chỉ dùng chữ, số, -, _ (có dấu . như backup.sh sẽ bị run-parts bỏ qua), file cron.d phải thuộc root và không cho group/other ghi.
Biến từ .env thì load trong script, không dựa vào môi trường shell của bạn.
sudo logrotate -d /etc/logrotate.d/myapp # dry-run: in ra sẽ làm gì, không đổi filesudo logrotate -v -f /etc/logrotate.d/myapp # ép xoay ngay, in chi tiếtcat /var/lib/logrotate/status | grep myapp # lần xoay cuốisystemctl list-timers logrotate.timer # lần chạy kế tiếp
-d cũng không cập nhật state, nên kết quả kiểu log does not need rotating là do state hoặc điều kiện lịch, không phải lỗi cú pháp.