用 & 或 nohup 跑應用,在伺服器重新啟動、程式崩潰、或您想找它的記錄之前都沒問題——然後就散架了。systemd 是標準答案:它開機啟動您的應用、崩潰後重新啟動、並捕獲它的記錄。把指令碼或二進位變成受管服務,只需一個小檔案。
1. 寫一個 unit 檔案
建立 /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
把 ExecStart、WorkingDirectory 和 User 調整為您的應用。Restart=always 就是讓它保持存活的東西。
2. 建立一個專用使用者(推薦)
sudo useradd --system --no-create-home --shell /usr/sbin/nologin myapp
sudo chown -R myapp:myapp /opt/myapp
以非 root 使用者執行,可在應用被攻破時限制損失。
3. 啟用並啟動它
sudo systemctl daemon-reload
sudo systemctl enable --now myapp
enable 讓它開機啟動;--now 立即啟動它。
4. 檢查狀態和記錄
sudo systemctl status myapp
journalctl -u myapp -f # 跟隨即時日誌
日常指令
sudo systemctl restart myapp # 修改後重新啟動
sudo systemctl stop myapp # 停止它
sudo systemctl disable myapp # 取消開機自啟
誠實的提醒
- 編輯 unit 檔案後執行
daemon-reload,否則 systemd 用的是舊版本。 - 提防崩潰迴圈。 如果應用一啟動就失敗,
Restart=always會永遠重試——RestartSec=5拉開重試間隔;透過記錄修復根本錯誤。 - 首選非 root 的
User=,這樣被攻破的應用不會擁有整台伺服器。
下一步
systemd 服務就是您讓任何東西 24/7 執行的方式——例如一個全天候執行的 AI 代理,或自託管 RustDesk 伺服器背後的中繼。如果您的應用改用容器,Docker 的 --restart unless-stopped 扮演同樣的角色——見如何安裝 Docker。
評論
目前還沒有評論。歡迎成為第一位。