我已经设置了几个用户 systemd.timer(s)。
如何让它们自动启动?(在系统启动时或用户登录到 X 会话时)。
在我重新启动系统后(甚至systemctl --user enable
在重新启动之前运行,即没有帮助)我没有运行:
~$ systemctl --user enable {rsync_backup1,rsync_another_backup}.timer
~$ systemctl --user list-timers --all
0 timers listed.
Run Code Online (Sandbox Code Playgroud)
在这里,我需要使用以下命令来启动它们:
~$ systemctl --user start {rsync_backup1,rsync_another_backup}.timer
~$ systemctl --user list-timers --all
NEXT LEFT LAST PASSED UNIT
Sun 2016-07-31 13:26:45 CEST 1h 16min ago Sun 2016-07-31 14:43:32 CEST 2s ago rsync_backup1
Sun 2016-07-31 13:26:45 CEST 1h 16min ago Sun 2016-07-31 14:43:32 CEST 2s ago rsync_another_backup
2 timers listed.
~$
Run Code Online (Sandbox Code Playgroud)
以下是当前如何配置计时器的示例:
$HOME/.config/systemd/user/rsync_backup1.service :
[Unit]
Description=rsync --delete /home/USER data to …
Run Code Online (Sandbox Code Playgroud) 我创建使用systemd工作systemd-run --on-calendar ....
现在,我已经适当取代它.timer
和.service
文件,但我不能删除旧的。我可以停止并禁用它,但是当我调用systemctl list-timers
它时,它仍然显示为任意名称run-r0d0dc22...
。我也找过它的.timer
文件,但找不到。
在各种示例中,我看到了所有这些不同的选择建议:
然而,在我发现的例子中,没有提供进一步的解释。
以下页面也没有提供任何对 WantedBy 的解释:
我想了解一种简单的方法,我可以在需要时使用它来编写 systemd 计时器而不是 cron 作业。
*设置一个 cron 作业是 1 行。Systemd 计时器涉及写入两个文件并运行一两个 systemctl 命令。但是,根据我的经验,仅凭这一事实并不一定是使 systemd 计时器比 cron 更难的原因——这是众多选项和(似乎)缺乏清晰的文档以及完整解释的简单示例的原因。
我正在尝试将 Apache PrivateTmp 文件的清理间隔从默认的 30 天更改为 6 小时。我读到它来编辑时间间隔,我应该在/etc/tmpfiles.d/tmp.conf
而不是编辑中设置一个覆盖文件/usr/lib/tmpfiles.d/tmp.conf
,所以我用以下几行创建了该文件:
# override the default cleanup intervals
v /tmp 1777 root root 6h
v /var/tmp 1777 root root 6h
Run Code Online (Sandbox Code Playgroud)
现在,如果我运行systemd-tmpfiles --clean
,预期的文件将被删除,所以这部分工作正常。
但是,/usr/lib/systemd/system/systemd-tmpfiles-clean.timer
已经OnUnitActiveSec
设置为1d。我认为这意味着我 6 小时的清理间隔将有效地限制为每天一次。
我可以将该计时器间隔更改为 6 小时或更短,但是我应该直接编辑此文件,还是创建类似于/etc/tmpfiles.d
?
更新:这个问题被标记为重复,但我在链接的问题中没有看到任何关于我是否应该像文件一样使用覆盖文件的tmp.conf
内容。
解决方案:显然我无法将此作为答案发布,因为该问题已被标记为重复。但这就是我创建覆盖文件来更改计时器间隔的方式:
将现有的计时器文件复制到相应的覆盖目录:
sudo cp /usr/lib/systemd/system/systemd-tmpfiles-clean.timer /etc/systemd/system
编辑新副本(将 1d 值更改为 1h):
sudo nano /etc/systemd/system/systemd-tmpfiles-clean.timer
加载新的计时器文件:
sudo systemctl daemon-reload
确认已加载新的计时器间隔:
sudo systemctl list-timers
我创建了一个 systemd 用户计时器,该计时器每天到期,即午夜。问题是我的电脑通常在晚上暂停。当我早上醒来时,我希望计时器触发,但这并没有发生。我发现了 Persistent 选项,但这仅在系统断电时才有用,因为它在启动服务时会触发过期的计时器。除了例如运行每小时计时器并将时间戳保存到某个文件之外,还有其他解决方案吗?
编辑 2017-03-17:我在 ubuntu 16.10 上使用 systemd 231。我想要的是每天运行一次提醒,最好是在我早上醒来电脑时。
如何让下面的定时器自动启动?现在计时器只有在我这样做时才起作用systemctl start while-test.timer
。否则,即使我启用了计时器,它也不会自动启动。即使在执行systemctl daemon-reload
或重新启动之后。
while-test .service
-------------------
[Unit]
Description=While loop test script
[Service]
Type=simple
ExecStart=/home/user/bash/while-test.sh
[Install]
WantedBy=default.target
Run Code Online (Sandbox Code Playgroud)
和
while-test .timer
----------------
[Unit]
Description=While loop test script timer
[Timer]
OnCalendar=Mon *-*-* 10:52:00
Unit=while-test.service
[Install]
WantedBy=default.service
Run Code Online (Sandbox Code Playgroud) 有几个关于systemd
定时器的很好的参考资料,包括这个:
不幸的是,我仍然不清楚如何创建一个定期运行的计时器,但在每小时结束后的特定分钟数内运行。
我想创建一个计时器,每 2 小时运行 30 分钟。因此它将在 14:30(下午 2:30)、16:30、18:30、20:30 等运行。
我尝试了几件不起作用的事情,包括:
OnCalendar=*-*-* *00/2:30
Run Code Online (Sandbox Code Playgroud)
和这个:
OnCalendar=*-*-* *:00/2:30
Run Code Online (Sandbox Code Playgroud)
我没有找到产生所需结果的时间规范。
此外,它不必在那一刻完全运行,所以我正在考虑使用:
AccuracySec=5m
Run Code Online (Sandbox Code Playgroud) 我有一个 systemd 计时器,每 10 分钟运行一次,用于下载我的电子邮件offlineimap
。问题是我有时会收到大量邮件或大附件,同时我可能正在路上使用我的手机\xe2\x80\x99s 按流量计费的连接。
现在我有一个自定义脚本,用于查询当前活动的连接nmcli
并检查它是否是计量连接。offlineimap
如果是这样,它根本不会运行。
我的问题是,systemd 计时器可以做同样的事情吗?沿着这些思路:
\n\n[Timer]\nOnUnitInactiveSec=10m\nRunOnMetered=no\n
Run Code Online (Sandbox Code Playgroud)\n 我正在编写一个脚本来准备我的 Linux 系统进行基准测试。除其他事项外,我想停止所有 systemd 计时器单元,然后恢复此操作。
简而言之,我需要相当于 service crond stop/start
.
到目前为止我所发现的只是systemctl list-timers
然后手动停止每个,然后手动启动每个。你知道任何更好、更通用的解决方案吗?
我有一个计时器,字面上是这样的:
foobar.service:
[Unit]
Description=Timer Test
Requires=rsyslog.service # rsyslog is an active local service.
[Service]
Type=simple
ExecStart=/usr/bin/logger "Running foobar timer test!"
Run Code Online (Sandbox Code Playgroud)
foobar.timer:
[Unit]
Description=Test Timer
[Timer]
OnCalendar=10:00 # See below about the time.
Unit=foobar.service
RemainAfterElapse=no
[Install]
WantedBy=timers.target
Run Code Online (Sandbox Code Playgroud)
我通过在未来 10 分钟内安装它 ( systemctl enable foobar.timer
) 来测试它OnCalendar
。但是,它不会运行,并且:
> systemctl status foobar.timer
? foobar.timer - Local Daily Tasks Timer
Loaded: loaded (/etc/systemd/system/what.timer; enabled; vendor preset: enabled)
Active: inactive (dead)
Trigger: n/a
Run Code Online (Sandbox Code Playgroud)
它声称已加载并启用,但不活动(已死)。这尤其令人困惑,因为我已经按照这种模式编写了其他计时器并且它们都可以工作...o_O?
除了重新启动系统(我不喜欢这样做,它是一个活动服务器)之外,我已经完成了所有工作。