跳到正文
馬克工具箱

systemd 服務檔案產生器

想讓 Node.js、Python、Go 程式在 Linux 伺服器上常駐執行、開機自啟、崩潰後自動重啟,又記不住 systemd 的各種選項?填寫啟動命令和執行使用者,選好重啟策略和環境變數,就能複製 .service 檔案和安裝啟動命令。勾選「定時執行」還會生成 .timer,可以代替 cron 做定時任務。

在瀏覽器本地執行,輸入的內容和檔案都不會上傳

也是檔名,例如 myapp → myapp.service

程式要寫完整路徑,例如 /usr/bin/python3 app.py

命令在前臺一直執行(大多數 Web 應用和指令碼)。

每行一個 KEY=value,值裡有空格會自動加引號。

0 表示用系統預設值。

myapp.service

安裝並啟動

在伺服器上以 root 貼上執行這些命令。修改單元檔案後要再執行一次 systemctl daemon-reload。檢視日誌:journalctl -u <名稱>。

使用步驟

  1. 填寫服務名稱、帶完整路徑的啟動命令和工作目錄。
  2. 設定執行使用者、自動重啟方式和環境變數。
  3. 需要的話開啟基本加固,或者填寫時間表(OnCalendar)生成定時器。
  4. 複製生成的檔案,或者把安裝命令貼上到伺服器的 root 終端裡執行。

引數說明

型別(Type)
simple 適合一直在前臺執行的程式;oneshot 適合執行一次就結束的指令碼,例如定時任務。
自動重啟
「異常退出時」在程式報錯退出或崩潰時重啟;「總是」連正常退出也會重啟。
OnCalendar
定時器什麼時候觸發,例如 daily,或 *-*-* 03:00:00 表示每天凌晨 3 點。可以用 systemd-analyze calendar 檢查寫法。

示例:把每晚任務做成定時器

要讓指令碼每晚凌晨 3 點執行,把「啟動命令(ExecStart)」設為 /usr/local/bin/backup.sh,服務名稱設為 backup,「型別(Type)」設為 oneshot,「自動重啟」設為「不重啟」,然後勾選「定時執行(同時生成 .timer)」和「基本加固」。用預設的執行使用者和工作目錄,產生器會產出兩個檔案。backup.service:

[Unit]
Description=Nightly backup

[Service]
Type=oneshot
User=www-data
WorkingDirectory=/srv/myapp
ExecStart=/usr/local/bin/backup.sh
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=read-only

以及 backup.timer:

[Unit]
Description=Run backup on a schedule

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
Unit=backup.service

[Install]
WantedBy=timers.target

開啟定時器後有兩處變化。服務檔案不再有 [Install] 部分,因為由定時器來啟動它;安裝命令啟用的也是定時器而不是服務:

sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers backup.timer
journalctl -u backup.service -f

勾選定時器選項時不會替你修改「型別」,所以會執行完就結束的任務請自己選 oneshot。oneshot 服務配合「自動重啟」設為「總是」是無效的,所以產生器會省略重啟設定並顯示警告。

常見問題

檔案放在哪裡?

放在 /etc/systemd/system/ 目錄,然後執行 systemctl daemon-reload 和 systemctl enable --now 服務名.service。生成的命令已經包含這些步驟。

啟動時報 「Executable path is not absolute」 怎麼辦?

舊版 systemd 要求 ExecStart 寫程式的完整路徑,可以用 which 查,例如 which node。

用定時器還是 cron?

定時器的日誌進 journal,能補跑關機期間錯過的任務,也不會重複併發執行;cron 寫一行就行,簡單場景照樣好用。

隱私說明

本工具完全在瀏覽器中執行,檔案和文字都在你的裝置上處理,不會上傳到我們的伺服器。

相關工具