Systemd
創建一個延遲 30 分鐘的 systemd 啟動腳本
我試圖創建一個 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
如果您以前從未啟用此服務並且正在從頭開始實施此設置,則不需要該命令。
重新啟動後,這應該可以按照您描述的要求正常工作。