Systemd

防止 systemd 計時器在啟動時執行

  • January 8, 2022

我一直在將我的 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 的任何隨機時間。有任何想法嗎?


更新:我通過將我的“使用者”計時器轉換為根/系統計時器解決了這個問題。

  1. 我禁用了所有的 .service 和 .timer 文件,並將它們從我的主目錄移到 /etc/systemd/system 中。
  2. 我在每個服務文件中添加了 ‘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。

引用自:https://unix.stackexchange.com/questions/363976