Mục lục

Systemd & Services

Cách giữ ứng dụng (NodeJS, Python, Go) luôn chạy 24/7, tự khởi động lại khi crash bằng Systemd.

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:

  1. Auto Start: Tự chạy khi bật máy.
  2. Auto Restart: Tự sống lại nếu bị crash lỗi.
  3. 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

bash:
sudo nano /etc/systemd/system/my-blog.service

Bước 2: Nội dung cấu hình

ini:
[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.target

3. 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.

bash:
# 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-blog

Nế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:

bash:
# 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 -b

5. Các lệnh quản lý Service thường dùng

LệnhTá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:

  1. Kiểm tra ExecStart xem đường dẫn file có đúng không.
  2. Kiểm tra User có quyền truy cập vào thư mục code không (chmod/chown).
  3. Chạy thử lệnh trong ExecStart trực tiếp trên terminal xem có lỗi cú pháp code không.
Quảng cáo
mdhorizontal