创建一个延迟 30 分钟的 systemd 启动脚本

rub*_*o77 1 sleep systemd rkhunter

我尝试创建一个 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

Run Code Online (Sandbox Code Playgroud)

但这失败并出现超时错误

Job for rkhunter.service failed because a timeout was exceeded.
Run Code Online (Sandbox Code Playgroud)

ExecStartPre 似乎不是这样工作的。

我该如何解决这个问题?

一个完美的解决方案是:

  • 开机后首次运行 30 分钟
  • 每 48 小时重复一次(以防您从不关闭笔记本电脑)

fil*_*den 8

使用计时器单元来安排您的服务开始时间。计时器单元足够灵活,您可以使用一个计时器来安排启动后 30 分钟的初始运行以及第一次运行后 48 小时的重复运行。(您甚至可以决定是在首次启动后 48 小时还是在完成运行后 48 小时使用它。)

文件rkhunter.service

[Unit]
Description=rkhunter check with zenity findings

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/rkhunter-check
Run Code Online (Sandbox Code Playgroud)

文件rkhunter.timer

[Unit]
Description=timer for rkhunter check

[Timer]
OnBootSec=30min
OnUnitActiveSec=48h

[Install]
WantedBy=timers.target
Run Code Online (Sandbox Code Playgroud)

请注意,您[Install]的服务单元中不需要某个部分,因为您不想“启用”它,因为这会在引导序列期间运行它,而您想要的是仅在 30 分钟后运行它。

您需要启用计时器单元,以便它在启动时实际启用并在配置的时间启动服务单元。所以:

systemctl daemon-reload
systemctl enable rkhunter.timer
Run Code Online (Sandbox Code Playgroud)

如果您之前启用了该服务,您将需要明确禁用它,因为它现在应该只能由您的计时器单元启动:

systemctl disable rkhunter.service
Run Code Online (Sandbox Code Playgroud)

如果您之前从未启用过此服务并且是从头开始实施此设置,则不需要该命令。

重新启动后,这应该可以按照您描述的要求正常工作。

  • @rubo77 我实际上认为这从我的帖子中已经很清楚了,正如我所说:*“请注意,您的服务单元中不需要 [Install] 部分,因为您不想‘启用’它”。* 如果您认为为了清楚起见可以重新措辞,您能否提出更好的措辞? (2认同)
  • @rubo77你只需要“systemctl禁用rkhunter.service”,因为你之前启用了该服务......如果你做了一个干净的房间实现,你就不需要它。我将再次编辑以澄清这一点。 (2认同)