使用步驟
- 填寫服務名稱、帶完整路徑的啟動命令和工作目錄。
- 設定執行使用者、自動重啟方式和環境變數。
- 需要的話開啟基本加固,或者填寫時間表(OnCalendar)生成定時器。
- 複製生成的檔案,或者把安裝命令貼上到伺服器的 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 寫一行就行,簡單場景照樣好用。
隱私說明
本工具完全在瀏覽器中執行,檔案和文字都在你的裝置上處理,不會上傳到我們的伺服器。