
Trong môi trường Debian, việc quản lý các tiến trình nền bằng systemd
hay init.d
đôi khi chưa đủ linh hoạt khi cần giám sát, tự khởi động lại, hay scale nhiều instance một cách nhanh gọn. Supervisor là một process control system chạy trên Python, cho phép bạn định nghĩa, theo dõi và quản lý daemon thông qua file cấu hình đơn giản.
Với Supervisor, bất kỳ tiến trình nào – từ web server tự viết, worker xử lý queue cho đến script chạy dài hạn – đều có thể được daemonize, auto-restart và quản lý tập trung bằng supervisorctl. Bài này sẽ tập trung vào cách cài đặt và sử dụng Supervisor trên Debian để quản lý daemon hiệu quả hơn.
1. Daemon Supervisor trên Debian là gì?
Supervisor là một process control system (hệ thống điều khiển tiến trình) viết bằng Python, chạy như một daemon trên hệ điều hành. Trên Debian, Supervisor đóng vai trò là một trình quản lý daemon:
- Cho phép bạn biến bất kỳ tiến trình nào (script, web server, worker, job xử lý nền…) thành dịch vụ (daemon).
- Hỗ trợ autostart khi hệ thống hoặc chính Supervisor khởi động.
- Tự động autorestart nếu tiến trình bị crash hoặc dừng bất thường.
- Cung cấp công cụ dòng lệnh
supervisorctl
và API để giám sát, điều khiển tiến trình (start, stop, restart, status). - Quản lý nhiều tiến trình độc lập thông qua các file cấu hình trong
/etc/supervisor/conf.d/
.
2. Cách sử dụng Daemon Supervisor trên Debian
Bước 1: Cài đặt Supervisor trên Debian
sudo apt update
sudo apt install supervisor -y
Bước 2: Sau khi cài đặt, Supervisor sẽ tự chạy dưới dạng Service:
systemctl status supervisor
Bước 3: Chuyển sang cấu hình Supervisor
– Tệp cấu hình của giám sát là /etc/supervisor/supervisord.conf
– Các tệp cấu hình cho các ứng dụng do Supervisor quản lý được lưu /etc/supervisor/conf.d/
trong thư mục. Bạn cần cấu hình từng ứng dụng. /etc/supervisor/conf.d/
Hãy tạo xxxxxx.conf
một tệp cấu hình cho mỗi ứng dụng.
Ví dụ về nội dung tệp conf:
[program:cloudreve]
command=/pipu/cloudreve/cloudreve
directory=/pipu/cloudreve/
user = root
stopsignal = INT
autostart = true
autorestart = true
startsecs = 1
stderr_logfile = /var/log/cloudreve.err.log
Thêm Debian để khởi động
systemctl enable supervisor
supervisorctl start all
3. Một số lệnh để quản lý dịch vụ với Supervisorctl?
# Kiểm tra danh sách chương trình
sudo supervisorctl status# Khởi động tiến trình
sudo supervisorctl start myapp# Dừng tiến trình
sudo supervisorctl stop myapp# Restart tiến trình
sudo supervisorctl restart myapp# Xem trạng thái chi tiết
sudo supervisorctl tail -f myapp
Khởi động Superviso cùng hệ thống?
sudo systemctl enable supervisor
sudo systemctl start supervisor
3. Một số lưu ý khi sử dụng Daemon Supervisor trên Debian
– Quyền và User chạy tiến trình
- Lưu ý: Tránh chạy daemon bằng
root
nếu không cần thiết → dễ gây rủi ro bảo mật. - Sự cố: Nếu khai báo
user=
trong cấu hình nhưng user đó không có quyền truy cập file/script, tiến trình sẽ fail ngay khi start.
– Đường dẫn tuyệt đối
- Lưu ý:
command
vàdirectory
trong config nên dùng đường dẫn tuyệt đối. - Sự cố: Dùng đường dẫn tương đối → Supervisor không tìm thấy file, báo lỗi “No such file or directory”.
– Log file và dung lượng đĩa
- Lưu ý: Supervisor ghi log stdout/stderr của tiến trình vào file (vd:
/var/log/myapp.out.log
). - Sự cố: Nếu ứng dụng in log quá nhiều → log file phình to → đầy ổ cứng: Cách xử lý: Dùng
logrotate
hoặc cấu hìnhstdout_logfile_maxbytes
vàstdout_logfile_backups
.
– Autorestart không hoạt động như mong đợi
- Lưu ý:
autorestart=true
chỉ restart khi tiến trình thoát bất thường. Nếu tiến trình exit code = 0 → Supervisor nghĩ là “chạy xong rồi” nên không restart. - Cách xử lý: Dùng
autorestart=unexpected
+exitcodes=
để định nghĩa các mã thoát cần restart.
– Chạy nhiều instance
- Lưu ý: Muốn chạy nhiều instance của cùng một chương trình thì phải khai báo
process_name=%(program_name)s_%(process_num)02d
+numprocs=N
. - Sự cố: Nếu quên cấu hình này → Supervisor chỉ chạy được 1 process duy nhất.
– Xung đột với systemd
- Lưu ý: Debian mặc định dùng
systemd
. Nếu cùng lúc khai báo service trongsystemd
và Supervisor → dễ trùng port hoặc xung đột quản lý. - Giải pháp: Quyết định rõ dịch vụ nào do
systemd
quản lý, dịch vụ nào để Supervisor quản lý.
– Config không áp dụng ngay
- Sự cố: Chỉnh sửa file
.conf
nhưng service không thay đổi. - Nguyên nhân: Chưa chạy
supervisorctl reread
vàsupervisorctl update
.
Leave a Reply