systemd: chạy ứng dụng như một dịch vụ Linux tự khởi động lại

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Bạn chạy ứng dụng bằng node server.js trong cửa sổ SSH, đóng cửa sổ là ứng dụng chết. Máy chủ khởi động lại là phải bật tay. Trên hầu hết bản phân phối Linux hiện nay, systemd giải quyết gọn vấn đề này: ứng dụng chạy nền, tự bật khi khởi động máy và tự bật lại khi sập.

systemd là gì?

systemd là hệ thống quản lý dịch vụ của nhiều bản phân phối Linux phổ biến như Ubuntu, Debian, CentOS. Mỗi dịch vụ được mô tả bằng một file unit có đuôi .service. Bạn điều khiển chúng bằng lệnh systemctl và xem nhật ký bằng journalctl.

Viết file service đầu tiên

Giả sử ứng dụng Node.js nằm ở /opt/myapp. Tạo file /etc/systemd/system/myapp.service:

[Unit]
Description=Ung dung web cua toi
After=network.target

[Service]
Type=simple
User=deploy
WorkingDirectory=/opt/myapp
EnvironmentFile=/opt/myapp/.env
ExecStart=/usr/bin/node server.js
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Ba phần của file:

  • [Unit]: mô tả và thứ tự khởi động. After=network.target nghĩa là chạy sau khi mạng sẵn sàng.
  • [Service]: cách chạy. User chạy bằng người dùng thường thay vì root, ExecStart là lệnh chạy (nên dùng đường dẫn tuyệt đối), Restart=on-failure tự bật lại nếu ứng dụng thoát với lỗi.
  • [Install]: khi bật tự khởi động thì gắn vào mục tiêu nào. multi-user.target là chế độ chạy nhiều người dùng thông thường.

Dòng EnvironmentFile nạp biến môi trường từ file riêng, tránh ghi bí mật thẳng vào unit.

Kích hoạt dịch vụ

sudo systemctl daemon-reload
sudo systemctl enable --now myapp
sudo systemctl status myapp

Sau khi sửa file unit lần nào cũng phải chạy daemon-reload để systemd đọc lại. Cờ --now vừa bật tự khởi động vừa khởi động ngay.

Các lệnh điều khiển thường dùng

LệnhTác dụng
systemctl start myappKhởi động
systemctl stop myappDừng
systemctl restart myappKhởi động lại
systemctl enable myappTự chạy khi bật máy
systemctl disable myappBỏ tự chạy
systemctl status myappXem trạng thái

Xem log với journalctl

journalctl -u myapp -f
journalctl -u myapp --since today
journalctl -u myapp -n 100 --no-pager

Mọi thứ ứng dụng in ra stdout và stderr đều được systemd thu về, nên bạn không cần tự quản lý file log cho các ứng dụng đơn giản. Cờ -f theo dõi trực tiếp, -u chọn dịch vụ.

Khi dịch vụ không chạy

  1. Chạy systemctl status myapp và đọc vài dòng cuối.
  2. Xem journalctl -u myapp -n 50 để biết lỗi thật.
  3. Kiểm tra đường dẫn trong ExecStart có tuyệt đối không (which node cho biết vị trí).
  4. Kiểm tra người dùng khai báo có quyền đọc thư mục ứng dụng không.
  5. Nếu dịch vụ khởi động lại liên tục, systemd có thể tạm ngừng thử. Sửa lỗi rồi dùng systemctl reset-failed.

Một số tùy chọn bảo vệ thêm

Bạn có thể thêm các tùy chọn như NoNewPrivileges=true hay ProtectSystem=full trong phần Service để thu hẹp quyền của ứng dụng. Hãy thử từng dòng một vì chúng có thể chặn ứng dụng ghi vào chỗ nó cần.

Kết luận

Một file unit khoảng mười dòng đủ để biến ứng dụng thành dịch vụ đáng tin cậy: chạy nền, tự khởi động, tự hồi phục và có nhật ký tập trung. Đây là bước chuyển từ 'chạy thử trên máy chủ' sang 'vận hành thật'.

Để học trọn bộ kỹ năng triển khai từ Linux đến CI/CD, bạn có thể tham khảo khóa học trên codebem.com.

author_photo
Nguyễn Đình Cường

0 comment