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

Tom*_*Tom 31 linux scheduling systemd services

我想在启动到系统后每 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
Run Code Online (Sandbox Code Playgroud)

foo.timer

[Unit]
Description=run foo

[Timer]
where I am stuck... ???
Run Code Online (Sandbox Code Playgroud)

Rei*_*hin 37

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

例子:

/etc/systemd/system/test.service

[Unit]
Description=test job

[Service]
Type=oneshot
ExecStart=/bin/bash /tmp/1.sh
Run Code Online (Sandbox Code Playgroud)

/etc/systemd/system/test.timer

[Unit]
Description=test

[Timer]
OnUnitActiveSec=10s
OnBootSec=10s

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

之后使用命令重新加载 systemdsystemctl daemon-reload并通过 启动计时器systemctl start test.timer,或默认启用它 ( systemctl enable test.timer)。

测试内容 1.sh

#!/bin/bash
echo `date` >> /tmp/2
Run Code Online (Sandbox Code Playgroud)

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

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

  • 你的例子中哪里设置了30分钟? (3认同)
  • @KarlMorrison 例如设置为 10 秒,将值更改为 30 分钟以获得完全满意的体验 (3认同)
  • 请使用“systemctl list-timers --all”命令并检查输出。他需要像[这个](http://pastebin.com/cteCmFGw)。查看单位、左侧和通过的列。如果计时器存在,请查看您的服务文件并检查其中是否有错误,因为计时器正常工作。 (2认同)
  • 不,因为主要问题没有询问有关“notify-send”的任何内容,我认为我们不应该在这种[主题](http://unix.stackexchange.com/questions/111188/using-notify- send-with-cron) 已经存在。对于您的情况,请尝试将“export DISPLAY=:0.0”添加到脚本中。 (2认同)

hoo*_*enz 17

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

[Unit]
Description=Run foo

[Service]
User=%I
Restart=always
RestartSec=1800s
ExecStart=/bin/bash /home/user/script.sh
Run Code Online (Sandbox Code Playgroud)

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

fcm*_*fcm 10

正确的方法是使用systemd-run您可以安排您的工作,而不需要定义您自己的单位。

它允许您按日历或每个时间段进行安排。假设 MYSELF 是您的完整路径应用程序:

systemd-run --user --on-calendar '*:0/1' ${MYSELF} <args>
Run Code Online (Sandbox Code Playgroud)