防止 systemd 計時器在啟動時執行
我一直在將我的 crontab 遷移到 systemd 的計時器單元。它們看起來都類似於:
.timer 文件:
[Unit] Description=timer that uses myjob.service [Timer] OnCalendar=*-*-* *:00:00 Unit=myjob.service [Install] WantedBy=timers.target
.服務文件:
[Unit] Description=Script that runs myjob.sh [Service] ExecStart=/home/user/myjob.sh
我的計時器可以工作,但它們也會在系統重新啟動時執行。我希望我的 OnCalendar 事件僅在指定時間執行,而不是我重新啟動 PC 的任何隨機時間。有任何想法嗎?
更新:我通過將我的“使用者”計時器轉換為根/系統計時器解決了這個問題。
- 我禁用了所有的 .service 和 .timer 文件,並將它們從我的主目錄移到 /etc/systemd/system 中。
- 我在每個服務文件中添加了 ‘User=’ 部分,這樣我的腳本就由普通使用者而不是 root 執行。
現在我的計時器在系統啟動時沒有被觸發,當我通過 ssh 登錄時,我也遇到了偶爾觸發的問題。現在這也得到了解決,因為它們在 root 帳戶的控制下,但執行我的腳本仍然作為普通使用者的 PID 執行,這保留了我的文件的所有權屬性。問題解決了。
我也遇到了同樣的問題,無法弄清楚為什麼無論
Persistent
.timer 文件中的設置如何,單元總是在啟動時執行,我花了一段時間,但我終於找到了原因(@alexander 指出了正確的方向-托爾卡喬夫的評論)。問題是我總是
WantedBy=basic.target
在$$ Install $$.service 文件的部分(因為它是標準 systemd 服務複製麵食的一部分)。事實證明,這實際上會導致該單元在 basic.target 為(又名系統啟動)時啟動。 https://www.freedesktop.org/software/systemd/man/systemd.unit.html#WantedBy= https://www.freedesktop.org/software/systemd/man/systemd.special.html#basic.target
我懷疑 OP 通過禁用舊的 .service (您必須這樣做以刪除由 創建的符號連結
WantedBy
)並忽略$$ Install $$部分當他們重新編寫或從未執行時
systemctl enable
。 **TLDR;**你不想要一個$$ Install $$由 .timer 文件觸發的 .service 文件中的部分。
根據文件,您應該將配置更改為
Persistent=false
或完全刪除Persistent
,因為預設情況下它為 false。