创建延迟 30 分钟的 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 小时重复一次(以防您从未关闭笔记本电脑)

答案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建议的

相关内容