Đúng 👍
Kết hợp flock + timeout là cách chuẩn, an toàn và “sạch” nhất để đảm bảo process tự thoát, không treo, không chạy song song trên Linux (đặc biệt khi chạy cron).


1️⃣ Vấn đề thường gặp (rất đúng với case cron / PHP / WordPress của bạn)

  • Script chạy lâu → treo
  • Cron chạy lại → chạy song song
  • Script chết giữa chừng → lock không được giải phóng
  • Server yếu / MySQL lag → process treo vĩnh viễn

👉 Kết quả: load cao, data lỗi, phải kill tay.


2️⃣ Nguyên tắc chuẩn

Công cụVai trò
flockChỉ cho 1 process chạy tại 1 thời điểm
timeoutÉp tự kill sau X giây
execTránh sinh shell con không cần thiết

3️⃣ Mẫu dùng chuẩn nhất (khuyên dùng)

timeout 300s flock -n /tmp/myjob.lock \
php /var/www/domain.com/cron/cron.php

Giải thích:

  • timeout 300s
    → quá 5 phút là tự kill
  • flock -n /tmp/myjob.lock
    → nếu đang chạy → thoát ngay
  • Không cần rm lock
    → process chết thì lock tự giải phóng

Không treo
Không chạy trùng
Không cần cleanup thủ công


4️⃣ Sai lầm phổ biến ❌

❌ Dùng file lock thủ công

if [ -f lock ]; then exit; fi
touch lock
# chạy
rm lock

➡️ Script chết là lock tồn tại mãi


❌ Chỉ dùng flock, không timeout

flock /tmp/job.lock php cron.php

➡️ Script treo = lock treo vĩnh viễn


❌ Dùng kill -9 thủ công

➡️ Mất kiểm soát, dễ kill nhầm process khác


5️⃣ Bản nâng cao (log + signal sạch)

timeout --signal=SIGTERM 300s \
flock -n /tmp/myjob.lock \
php /var/www/domain.com/cron/cron.php >> /var/log/myjob.log 2>&1
  • SIGTERM → cho PHP/MySQL thoát mềm
  • Hết thời gian → SIGKILL tự động