Systemd

創建一個延遲 30 分鐘的 systemd 啟動腳本

  • September 16, 2021

我試圖創建一個 systemd 啟動腳本,在我的筆記型電腦系統啟動 30 分鐘後啟動 rkhunter 掃描,如下所示:

[Unit]
Description=starts rkhunter and displays any findings with zenity

[Service]
ExecStartPre=/bin/sleep 1800
ExecStart=/usr/local/sbin/rkhunter-check

[Install]
WantedBy=default.target

但這失敗並出現超時錯誤

Job for rkhunter.service failed because a timeout was exceeded.

似乎 ExecStartPre 不能這樣工作。

我該如何解決這個問題?

一個完美的解決方案是:

  • 開機 30 分鐘後首次執行
  • 每 48 小時重複一次(以防您從不關閉筆記型電腦)

如果您想在服務中使用長睡眠命令,ExecStartPre您需要使用以下命令禁用超時TimeoutStartSec=infinity

[Unit]
Description=starts rkhunter and displays any findings with zenity

[Service]
TimeoutStartSec=infinity
ExecStartPre=/bin/sleep 1800
ExecStart=/usr/local/sbin/rkhunter-check

[Install]
WantedBy=default.target

如果您想每 48 小時重複啟動一次服務,請按照@filbranden 的建議添加一個計時器

使用計時器單元來安排您的服務開始時間。計時器單元足夠靈活,您可以使用一個計時器單元來安排初始執行(啟動後 30 分鐘)以及第一次執行後 48 小時的重複。(您甚至可以決定是在它首次啟動後 48 小時還是在它完成執行後 48 小時使用它。)

文件rkhunter.service

[Unit]
Description=rkhunter check with zenity findings

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/rkhunter-check

文件rkhunter.timer

[Unit]
Description=timer for rkhunter check

[Timer]
OnBootSec=30min
OnUnitActiveSec=48h

[Install]
WantedBy=timers.target

請注意,您的服務單元中不需要某個[Install]部分,因為您不想“啟用”它,因為這會在引導序列期間執行它,而您想要的只是在 30 分鐘後執行它。

您需要啟用計時器單元,因此它實際上會在啟動時啟用並在配置的時間啟動服務單元。所以:

systemctl daemon-reload
systemctl enable rkhunter.timer

如果您之前啟用了該服務,您需要明確禁用它,因為它現在只能由您的計時器單元啟動:

systemctl disable rkhunter.service

如果您以前從未啟用此服務並且正在從頭開始實施此設置,則不需要該命令。

重新啟動後,這應該可以按照您描述的要求正常工作。

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