EQVPS

Cách tạo một dịch vụ systemd để giữ ứng dụng luôn chạy

Biến bất kỳ script hay ứng dụng nào thành một dịch vụ được quản lý: khởi động khi boot, khởi động lại nếu sập, và ghi log vào journalctl. Viết một tệp unit, bật nó, và kiểm tra trạng thái — cách chuẩn để chạy thứ gì đó 24/7 trên Linux.

Chạy một ứng dụng với & hoặc nohup vẫn ổn cho đến khi máy chủ khởi động lại, tiến trình sập, hoặc bạn muốn tìm log của nó — rồi mọi thứ rã rời. systemd là câu trả lời chuẩn: nó khởi động ứng dụng của bạn khi boot, khởi động lại nếu nó chết, và bắt log của nó. Biến một script hay tệp nhị phân thành một dịch vụ được quản lý chỉ là một tệp nhỏ.

1. Viết một tệp unit

Tạo /etc/systemd/system/myapp.service:

[Unit]
Description=My application
After=network.target

[Service]
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/run.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Điều chỉnh ExecStart, WorkingDirectoryUser cho ứng dụng của bạn. Restart=always chính là thứ giữ nó sống.

2. Tạo một người dùng chuyên biệt (khuyến nghị)

sudo useradd --system --no-create-home --shell /usr/sbin/nologin myapp
sudo chown -R myapp:myapp /opt/myapp

Chạy dưới người dùng không phải root giới hạn thiệt hại nếu ứng dụng có ngày bị xâm phạm.

3. Bật nó và khởi động nó

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

enable làm nó khởi động khi boot; --now khởi động nó ngay lập tức.

4. Kiểm tra trạng thái và log

sudo systemctl status myapp
journalctl -u myapp -f       # theo dõi log trực tiếp

Lệnh hằng ngày

sudo systemctl restart myapp   # khởi động lại sau một thay đổi
sudo systemctl stop myapp      # dừng nó
sudo systemctl disable myapp   # thôi khởi động khi boot

Cảnh báo thành thật

Bước tiếp theo

Một dịch vụ systemd là cách bạn giữ bất cứ thứ gì chạy 24/7 — ví dụ một tác nhân AI chạy suốt ngày đêm hoặc relay đằng sau một máy chủ RustDesk tự lưu trữ. Nếu ứng dụng của bạn được đóng gói container thay vì thế, --restart unless-stopped của Docker đóng cùng vai trò — xem cách cài đặt Docker.

FAQ

Tại sao dùng systemd thay vì chỉ chạy ứng dụng ở nền?

Một tiến trình chạy nền (với & hoặc nohup) chết khi khởi động lại, không trở lại nếu sập, và làm rải rác log của nó. Một dịch vụ systemd khởi động tự động khi boot, khởi động lại khi thất bại, và gửi đầu ra của nó tới journalctl. Đây là cách chuẩn, đáng tin cậy để chạy thứ gì đó tồn tại lâu trên Linux.

Tệp unit được đặt ở đâu?

Các dịch vụ của riêng bạn nằm trong /etc/systemd/system/, mỗi dịch vụ một tệp, đặt tên kiểu something.service. Sau khi tạo hoặc chỉnh sửa một tệp, chạy 'systemctl daemon-reload' để systemd nhận thay đổi, rồi bật và khởi động nó.

'Restart=always' làm gì, và có nhược điểm không?

Nó bảo systemd khởi động lại dịch vụ mỗi khi nó thoát, vì bất kỳ lý do nào — chìa khóa để giữ thứ gì đó chạy. Cái bẫy duy nhất là vòng lặp sập: nếu ứng dụng thất bại tức thì khi khởi động, systemd cứ khởi động lại nó. Thêm 'RestartSec=5' để giãn cách các lần thử, và xem log để sửa lỗi gốc.

Làm sao tôi xem log của dịch vụ?

Dùng 'journalctl -u yourservice -f' để theo dõi đầu ra trực tiếp, hoặc không có -f để đọc lịch sử. systemd bắt stdout và stderr tự động, nên bạn không cần tự nối tệp log.

Dịch vụ có nên chạy dưới quyền root không?

Tốt hơn là không. Tạo một người dùng chuyên biệt không phải root và đặt 'User=' trong unit, để việc ứng dụng bị xâm phạm không trao cả máy đi. Chỉ chạy dưới quyền root khi dịch vụ thực sự cần.

Bình luận

Chưa có bình luận nào. Hãy là người đầu tiên.

Để lại bình luận

Bình luận được kiểm duyệt trước khi hiển thị.