使用systemd每30分钟运行一次脚本


19

我想在启动系统后每30分钟执行一次脚本。我知道您可以使用cron,但是我不打算经常使用此功能,因此我想在systemd上尝试使用。

到目前为止,我只发现了单调计时器,它允许执行一次操作(至少我认为是这样)。如果我想从启动/系统启动起每30分钟执行一次操作,该foo.timerfoo@user.service会怎么样?

foo@user.service

[Unit]
Description=run foo
Wants=foo.timer

[Service]
User=%I
Type=simple
ExecStart=/bin/bash /home/user/script.sh

foo.timer

[Unit]
Description=run foo

[Timer]
where I am stuck... ???

Answers:


26

您需要创建两个文件:一个用于服务,另一个用于使用相同名称的计时器。

例:

/etc/systemd/system/test.service

[Unit]
Description=test job

[Service]
Type=oneshot
ExecStart=/bin/bash /tmp/1.sh

/etc/systemd/system/test.timer

[Unit]
Description=test

[Timer]
OnUnitActiveSec=10s
OnBootSec=10s

[Install]
WantedBy=timers.target

之后,使用command重新加载systemd systemctl daemon-reload并通过启动计时器systemctl start test.timer,或者默认情况下启用它们。

测试内容 1.sh

#!/bin/bash
echo `date` >> /tmp/2

和命令来检查所有可用的计时器: systemctl list-timers --all

项目页面上的更多详细信息以及ArchLinux页面上的示例


systemd接受脚本并将其列出,但是什么也没发生
TomTom

哪一个?应该有两个脚本,一个计时器和另一个服务。一次,当他们被处决可以通过列表的定时器命令进行检查,可能出现的错误,可以通过检查systemctl status test.timersystemctl status test.servicecomamand
Reishin

1
请使用systemctl list-timers --all命令并检查输出。他需要这样。查看单位,左侧和通过的列。如果存在计时器,请查看您的服务文件并检查其中的错误,因为计时器正常工作。
Reishin 2015年

1
不,因为主要问题对“通知发送”一无所求,而且我认为当这样的话题 已经存在时,我们不应该混合两种不同的东西。根据您的情况,尝试添加export DISPLAY=:0.0到脚本中。
Reishin

1
ps:根据man systemd.timer的说法,Persistent = true仅对使用OnCalendar(即wallclock)进行配置有效
snyh

11

这是不使用计时器的另一种选择。如果时间安排不是很关键,并且脚本不能长期运行,那么对简单的事情就可以了。

[Unit]
Description=Run foo

[Service]
User=%I
Restart=always
RestartSec=1800s
ExecStart=/bin/bash /home/user/script.sh

2
我喜欢这个解决方案。唯一的主要缺点是,如果您频繁(即每30秒)重新启动,系统日志将被“启动<service X>”日志充斥。此时,最好将服务作为守护程序运行,而不是一遍又一遍地从systemd重新启动该服务。
泽西豆

确实如此。对于快速简单的东西,它可以工作。但是计时器或长时间运行的脚本将是更好的解决方案。
Matt H
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.