Khi bạn chạy một ứng dụng bằng lệnh npm start hoặc python app.py, nếu tắt Terminal (SSH Disconnect), ứng dụng sẽ chết theo.
Để ứng dụng chạy ngầm (Background) bền bỉ như một Service chuyên nghiệp (giống Nginx hay MySQL), ta dùng Systemd.
1. Tư duy Service
Một Service chuẩn cần:
- Auto Start: Tự chạy khi bật máy.
- Auto Restart: Tự sống lại nếu bị crash lỗi.
- Logs: Ghi lại nhật ký hoạt động chuẩn hóa.
2. Tạo file Service (Ví dụ cho Node.js App)
Tạo một file cấu hình đuôi .service trong /etc/systemd/system/.
Ví dụ: Ứng dụng Blog Hello World.
User chạy: huynguyen
Đường dẫn code: /home/huynguyen/my-blog
Bước 1: Tạo file
sudo nano /etc/systemd/system/my-blog.serviceBước 2: Nội dung cấu hình
[Unit]
Description=My Awesome Node.js Blog
After=network.target
# Chờ có mạng mới chạy
[Service]
# User chịu trách nhiệm chạy app (Nên dùng user thường, KHÔNG dùng root)
User=huynguyen
Group=huynguyen
# Thư mục làm việc
WorkingDirectory=/home/huynguyen/my-blog
# Các biến môi trường (Nếu cần)
Environment=PORT=3000
Environment=NODE_ENV=production
# Câu lệnh khởi chạy (Nên dùng đường dẫn tuyệt đối của node)
# Gõ `which node` để lấy đường dẫn này
ExecStart=/home/huynguyen/.nvm/versions/node/v18/bin/node server.js
# Tự động restart khi crash
Restart=always
# Chờ 10s trước khi restart
RestartSec=10
[Install]
WantedBy=multi-user.target3. Kích hoạt và Quản lý Service
Sau khi lưu file, bạn cần báo cho Systemd biết và bật nó lên.
# 1. Reload lại systemd để nhận file mới
sudo systemctl daemon-reload
# 2. Bật Auto Start khi boot máy
sudo systemctl enable my-blog
# 3. Khởi chạy ngay lập tức
sudo systemctl start my-blog
# 4. Kiểm tra trạng thái
sudo systemctl status my-blogNếu thấy dòng Active: active (running) màu xanh lá là thành công!
4. Xem Log (Journalctl)
Systemd không in log ra màn hình, nó lưu vào Journal. Để xem log của app:
# Xem log realtime (đang chạy)
journalctl -u my-blog -f
# Xem 100 dòng log cuối cùng
journalctl -u my-blog -n 100
# Xem log từ lúc khởi động lại service gần nhất
journalctl -u my-blog -b5. Các lệnh quản lý Service thường dùng
| Lệnh | Tác dụng |
|---|---|
systemctl start [tên] | Bật service. |
systemctl stop [tên] | Tắt service. |
systemctl restart [tên] | Khởi động lại (Stop -> Start). |
systemctl reload [tên] | Nạp lại config (Không làm chết process, thường dùng cho Nginx). |
systemctl disable [tên] | Tắt tự khởi động khi boot. |
Mẹo Debug App chạy Systemd
Nếu service không start được (Active: failed), hãy:
- Kiểm tra
ExecStartxem đường dẫn file có đúng không. - Kiểm tra
Usercó quyền truy cập vào thư mục code không (chmod/chown). - Chạy thử lệnh trong
ExecStarttrực tiếp trên terminal xem có lỗi cú pháp code không.