−25%

Windows 年繳方案適用,至 10 月 31 日。 檢視方案

EQVPS
開始使用

如何建立 systemd 服務讓應用持續執行

把任何指令碼或應用變成受管服務:開機自啟、崩潰後自動重新啟動、記錄寫入 journalctl。寫一個 unit 檔案、啟用它、檢查狀態——這是在 Linux 上讓某樣東西 24/7 執行的標準方式。

用 & 或 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。

常見問題

為什麼用 systemd 而不是直接把應用放到後台跑?

後台程式(用 & 或 nohup)在重新啟動後就沒了,崩潰後不會回來,記錄也四散各處。systemd 服務會開機自啟、失敗後重新啟動,並把輸出送到 journalctl。這是在 Linux 上執行長期存活程式的標準、可靠方式。

unit 檔案放在哪裡?

您自己的服務放在 /etc/systemd/system/,每個服務一個檔案,命名為 something.service。建立或編輯後,執行 'systemctl daemon-reload' 讓 systemd 讀取變更,然後啟用並啟動它。

'Restart=always' 有什麼用,有沒有壞處?

它告訴 systemd 無論服務因何退出都重新啟動它——這是讓某樣東西保持執行的關鍵。唯一的隱患是崩潰迴圈:如果應用一啟動就立刻失敗,systemd 會不停重新啟動它。加上 'RestartSec=5' 把重試間隔拉開,並檢視記錄修復根本錯誤。

怎麼檢視服務的記錄?

用 'journalctl -u yourservice -f' 跟隨即時輸出,或去掉 -f 讀取歷史。systemd 會自動捕獲 stdout 和 stderr,所以您不必自己接記錄檔案。

服務應該以 root 執行嗎?

最好不要。建立一個專用的非 root 使用者,並在 unit 裡設定 'User=',這樣應用被攻破也不會交出整台機器。只在服務確實需要時才以 root 執行。

評論

目前還沒有評論。歡迎成為第一位。

發表評論

評論在顯示前會經過審核。