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, WorkingDirectory và User 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
- Chạy
daemon-reloadsau khi chỉnh sửa một tệp unit, nếu không systemd dùng phiên bản cũ. - Coi chừng vòng lặp sập. Nếu ứng dụng thất bại tức thì,
Restart=alwaysthử lại mãi mãi —RestartSec=5giãn cách các lần thử; sửa lỗi gốc qua log. - Ưu tiên một
User=không phải root để một ứng dụng bị xâm phạm không sở hữu cả máy chủ.
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.
Bình luận
Chưa có bình luận nào. Hãy là người đầu tiên.