Cách tạo systemd service để ứng dụng tự chạy trên VPS Linux
Hướng dẫn tạo systemd service trên Linux để quản lý tiến trình ứng dụng, tự khởi động cùng VPS và kiểm tra trạng thái, nhật ký hoạt động.
- 9 phút đọc
- 7 lượt xem

CÔNG TY TNHH CÔNG NGHỆ INUX
Hướng dẫn tạo systemd service trên Linux để quản lý tiến trình ứng dụng, tự khởi động cùng VPS và kiểm tra trạng thái, nhật ký hoạt động.

Hướng dẫn cài n8n trên VPS Ubuntu bằng Docker Compose, kết nối tên miền và bật HTTPS. Tự host n8n giúp bạn chủ động dữ liệu, đồng thời dễ dàng xây dựng các quy trình tự động hóa.
Khởi tạo tự động ngay sau khi thanh toán, chuyển khoản bằng mã QR, bật tắt và cài lại máy chủ trong trang quản lý.
Một ứng dụng chạy được trên VPS chưa chắc sẽ hoạt động ổn định sau khi bạn đóng phiên SSH hoặc máy chủ khởi động lại. Nếu đang chạy ứng dụng bằng lệnh thủ công, bạn có thể dùng systemd để quản lý tiến trình, tự khởi động ứng dụng cùng máy chủ và xem lỗi khi cần.
Trong bài viết này, bạn sẽ tìm hiểu systemd service là gì và cách tạo một service cơ bản trên Linux. Ví dụ sử dụng ứng dụng Node.js, nhưng các nguyên tắc về tệp cấu hình, quyền chạy và lệnh quản lý cũng có thể áp dụng cho nhiều chương trình khác.

systemd là hệ thống quản lý dịch vụ phổ biến trên nhiều bản phân phối Linux hiện nay, chẳng hạn Ubuntu và Debian. Một systemd service là một đơn vị cấu hình để systemd biết cách khởi chạy, dừng và theo dõi một tiến trình nền.
Thay vì đăng nhập VPS rồi tự chạy lệnh ứng dụng, bạn có thể khai báo lệnh đó trong một tệp service. Sau đó, systemd hỗ trợ:
Service không thay thế việc cấu hình ứng dụng, tường lửa hay cơ sở dữ liệu. Nó đảm nhiệm việc quản lý tiến trình. Bạn vẫn cần đảm bảo ứng dụng có đủ quyền, các tệp cấu hình cần thiết và những dịch vụ phụ thuộc đã sẵn sàng.

Trước khi tạo service, hãy đăng nhập vào VPS bằng SSH và xác định rõ thư mục ứng dụng, lệnh khởi chạy, tài khoản Linux sẽ chạy ứng dụng cùng các biến môi trường cần thiết. Trong bài hướng dẫn, giả sử ứng dụng Node.js nằm tại /opt/myapp, tệp khởi chạy là server.js và service có tên myapp.
Kiểm tra phiên bản Linux và đường dẫn chương trình Node.js:
cat /etc/os-release
command -v nodeLệnh command -v node trả về đường dẫn cần dùng trong cấu hình, ví dụ /usr/bin/node. Hãy dùng đường dẫn thực tế trên VPS. Nếu ứng dụng được cài Node.js qua trình quản lý phiên bản như nvm, đường dẫn trong môi trường SSH có thể không khả dụng với systemd. Khi đó, cần tìm đường dẫn tuyệt đối của Node.js hoặc cấu hình môi trường chạy phù hợp.
Service nên chạy bằng một tài khoản riêng, không nên mặc định chạy với quyền root nếu ứng dụng không cần quyền quản trị. Bạn có thể tạo tài khoản hệ thống như sau:
sudo useradd --system --home-dir /opt/myapp --shell /usr/sbin/nologin appuserTùy bản Linux, đường dẫn shell không đăng nhập có thể khác; hãy kiểm tra trước khi sử dụng. Đảm bảo tài khoản này đọc được mã nguồn và có quyền ghi vào những thư mục mà ứng dụng thực sự cần, chẳng hạn thư mục tải lên hoặc lưu dữ liệu. Không cấp quyền ghi rộng cho toàn bộ hệ thống chỉ để xử lý lỗi phân quyền.
Nếu chưa có ứng dụng, hãy đặt mã nguồn và tệp khởi chạy vào đúng thư mục trước khi bật service. Bạn cũng nên thử chạy ứng dụng thủ công bằng đúng tài khoản và lệnh dự định cấu hình. Việc này giúp phát hiện sớm lỗi đường dẫn, thiếu thư viện hoặc biến môi trường, thay vì phải đoán nguyên nhân sau khi systemd báo service thất bại.

Các tệp service do quản trị viên tự tạo thường được đặt trong /etc/systemd/system/. Tạo tệp có tên gắn với ứng dụng, chẳng hạn myapp.service:
sudo nano /etc/systemd/system/myapp.serviceThêm nội dung sau, đồng thời thay đường dẫn Node.js và thông tin ứng dụng cho phù hợp với VPS của bạn:
[Unit]
Description=My Node.js application
After=network.target
[Service]
Type=simple
User=appuser
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/node /opt/myapp/server.js
Restart=on-failure
RestartSec=5
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.targetÝ nghĩa các trường chính:
[Unit] mô tả service và thứ tự khởi động. After=network.target yêu cầu service bắt đầu sau mục tiêu mạng cơ bản; cấu hình này không đảm bảo ứng dụng đã kết nối được tới mọi dịch vụ mạng bên ngoài.Type=simple phù hợp với ứng dụng chạy ở foreground, tức tiến trình chính không tự đưa mình vào nền.User xác định tài khoản chạy ứng dụng. Tài khoản phải tồn tại và có quyền truy cập cần thiết.WorkingDirectory đặt thư mục làm việc. Điều này quan trọng nếu ứng dụng dùng đường dẫn tương đối.ExecStart là lệnh khởi chạy. Dùng đường dẫn tuyệt đối tới chương trình và tệp ứng dụng để tránh phụ thuộc vào môi trường của phiên SSH.Restart=on-failure yêu cầu systemd thử khởi động lại khi tiến trình kết thúc do lỗi. RestartSec=5 đặt khoảng chờ trước lần thử tiếp theo.Environment khai báo một biến môi trường đơn giản. Không nên ghi mật khẩu hoặc khóa bí mật trực tiếp vào tệp service; hãy dùng cơ chế quản lý biến bí mật phù hợp với môi trường của bạn.[Install] và WantedBy=multi-user.target cho phép bật service để chạy khi máy chủ khởi động vào chế độ hoạt động thông thường.Không thêm dấu & vào cuối lệnh trong ExecStart. systemd cần theo dõi tiến trình chính; nếu ứng dụng tự chạy nền, systemd có thể không nhận diện đúng trạng thái của ứng dụng. Với chương trình không phải Node.js, hãy thay ExecStart bằng lệnh khởi chạy tương ứng và kiểm tra đường dẫn bằng command -v.
Lưu tệp rồi thoát trình soạn thảo. Nếu chỉnh sửa service sau này, bạn cần yêu cầu systemd đọc lại cấu hình trước khi khởi động lại ứng dụng.
Sau khi tạo tệp, nạp lại danh sách unit để systemd nhận service mới:
sudo systemctl daemon-reloadKhởi động service ngay và bật chế độ tự chạy cùng máy chủ bằng một lệnh:
sudo systemctl enable --now myapp.serviceenable cấu hình service được gọi trong quá trình khởi động hệ thống; --now yêu cầu khởi động ngay ở thời điểm chạy lệnh. Nếu muốn thao tác riêng, dùng sudo systemctl start myapp.service để khởi động và sudo systemctl enable myapp.service để bật tự khởi động. Lưu ý: bật enable không nhất thiết khởi chạy service ngay, trừ khi dùng thêm --now.
Bạn có thể xác nhận cấu hình tự khởi động bằng lệnh:
sudo systemctl is-enabled myapp.serviceNếu kết quả là enabled, service đã được bật cho các lần khởi động hệ thống sau. Đây là bước quan trọng để ứng dụng tiếp tục chạy sau khi VPS được khởi động lại, thay vì chỉ chạy trong phiên hiện tại.
Dùng systemctl status để xem service có đang hoạt động không:
sudo systemctl status myapp.serviceNếu thấy trạng thái active (running), tiến trình đang chạy theo cấu hình hiện tại. Trạng thái failed cho biết service đã gặp lỗi; thông tin trên màn hình thường gồm mã thoát và một phần nhật ký gần nhất. Trạng thái có thể thay đổi nếu ứng dụng tự kết thúc hoặc gặp lỗi sau đó, vì vậy hãy kiểm tra log khi cần.
Để xem nhật ký của service:
sudo journalctl -u myapp.serviceTheo dõi log mới theo thời gian thực bằng:
sudo journalctl -u myapp.service -fNhấn Ctrl+C để dừng chế độ theo dõi. Khi cần xem log gần nhất, có thể kết hợp với tùy chọn giới hạn số dòng, ví dụ sudo journalctl -u myapp.service -n 100. Nhật ký giúp bạn nhận biết ứng dụng thiếu biến môi trường, không tìm thấy tệp, không kết nối được tới dịch vụ phụ thuộc hay gặp lỗi trong mã nguồn.
Các lệnh thường dùng để quản lý tiến trình gồm:
sudo systemctl stop myapp.service
sudo systemctl start myapp.service
sudo systemctl restart myapp.service
sudo systemctl disable myapp.servicestop dừng ứng dụng; start khởi chạy; restart dừng rồi chạy lại; còn disable tắt chế độ tự khởi động trong những lần khởi động hệ thống tiếp theo. Lệnh disable không nhất thiết dừng một service đang chạy. Nếu muốn vừa dừng vừa tắt tự khởi động, dùng sudo systemctl disable --now myapp.service.
Sau khi thay đổi nội dung tệp service, hãy chạy lại sudo systemctl daemon-reload, rồi khởi động lại service để áp dụng cấu hình mới:
sudo systemctl daemon-reload
sudo systemctl restart myapp.serviceNếu chỉ cập nhật mã nguồn ứng dụng mà không sửa tệp service, thông thường bạn chỉ cần khởi động lại tiến trình. Luôn kiểm tra systemctl status và log sau khi triển khai thay đổi để chắc chắn ứng dụng đã hoạt động theo mong đợi.
Nếu service không khởi động, hãy kiểm tra theo thứ tự để khoanh vùng nguyên nhân:
systemctl status myapp.service và journalctl -u myapp.service -n 100 để tìm thông báo lỗi cụ thể.ExecStart và WorkingDirectory tồn tại, đúng chính tả và là đường dẫn tuyệt đối.User đã tồn tại, có quyền đọc ứng dụng và quyền ghi vào thư mục cần thiết.daemon-reload rồi restart service.Một lỗi phổ biến là ứng dụng chạy bình thường trong SSH nhưng thất bại dưới systemd do khác môi trường. systemd không tự nạp các thiết lập trong tệp cấu hình shell như phiên đăng nhập. Vì vậy, hãy khai báo rõ thư mục làm việc, đường dẫn chương trình và biến môi trường cần thiết. Đồng thời, đừng dựa vào lệnh alias hoặc đường dẫn tương đối trong ExecStart.
Tạo systemd service là cách thực tế để quản lý tiến trình ứng dụng trên VPS Linux. Khi khai báo đúng tài khoản, thư mục làm việc và lệnh khởi chạy, bạn có thể bật ứng dụng tự chạy cùng máy chủ, điều khiển tiến trình bằng systemctl và tìm nguyên nhân lỗi qua nhật ký journalctl.
Nếu đang cần môi trường để triển khai ứng dụng, VibeVPS có các gói VPS AMD EPYC Gen 3 từ 81.000đ/tháng. Bạn có thể tham khảo cấu hình phù hợp với nhu cầu, sau đó áp dụng hướng dẫn trên để quản lý ứng dụng của mình.
Tìm hiểu cách cấu hình UFW Ubuntu để kiểm soát kết nối đến máy chủ, thiết lập quy tắc tường lửa cơ bản và mở cổng an toàn trên VPS.
Hướng dẫn cài PostgreSQL trên Ubuntu VPS, tạo người dùng và cơ sở dữ liệu đầu tiên, sau đó kiểm tra kết nối an toàn bằng dòng lệnh.