我尝试过了创建一个 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 小时重复一次(以防您从未关闭笔记本电脑)
答案1
用一个定时器单元安排您的服务开始时间。计时器单元足够灵活,您可以使用单个计时器来安排启动后 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
如果您以前从未启用过此服务并且从头开始实施此设置,则不需要该命令。
重新启动后,这应该可以按照您描述的要求正常工作。
答案2
如果您想在服务中使用长时间睡眠命令,则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建议的