标签: systemd-timer

systemd 在另一个成功时运行单元

我将一些 cron 作业转换为systemd.timer单位,并希望发送有关每个作业失败成功的邮件。

优秀的ArchLinux wiki 页面提供了相关信息,并且设置在失败时也能顺利运行。现在我想在单元成功运行时添加电子邮件通知,但根据systemd.unit没有名为OnSuccess=的配置的配置。

如何处理这个用例?

systemd systemd-timer

5
推荐指数
1
解决办法
3550
查看次数

成功完成另一个单元后指示执行另一个单元

我使用cloud-config来安装和配置DCOS集群。

通常agentinstall.service服务需要 5 分钟才能完成。

是否可以指示systemdagentconfigure.service 仅在 agentinstall.service完成后执行?

#云配置
核心:
  单位:
    - 名称:“agentinstall.service”
      命令:“开始”
      内容: |
        [单元]
        描述=代理设置
        之后=网络.目标

        [服务]
        类型=简单
        用户=root
        工作目录=/tmp
        ExecStartPre=/bin/curl -o /tmp/dcos_install.sh http://bootstapnode-0.dev.myztro.internal:9090/dcos_install.sh
        ExecStartPre=/bin/chmod 755 dcos_install.sh
        ExecStart=/bin/bash dcos_install.sh 从站

        [安装]
        WantedBy=多用户.target
    - 名称:“agentconfigure.service”
      命令:“开始”
      内容: |
        [单元]
        描述=代理配置
        之后=agentinstall.service

        [服务]
        类型=简单
        用户=root
        工作目录=/opt/mesosphere/etc/
        ExecStartPre=/bin/echo "MESOS_ATTRIBUTES=cluster:uploader" >> /opt/mesosphere/etc/mesos-slave-common
        ExecStartPre=/bin/rm -f /var/lib/mesos/slave/meta/slaves/latest
        ExecStart=/usr/bin/systemctl 重新启动 dcos-mesos-slave

        [安装]
        WantedBy=多用户.target

谢谢。

systemd systemd-timer

5
推荐指数
1
解决办法
1508
查看次数

systemd:如何在系统关闭时定期和一次运行作业?

我想定期(例如,每 5 分钟)运行一次作业,最后在系统关闭时运行一次。

Systemd 支持计时器,可用于定期运行作业。它还支持通过使用如下ExecStop钩子在系统关闭时运行作业:

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=<some command to run at system shutdown>
Run Code Online (Sandbox Code Playgroud)

但我很难将这两种方法结合起来。我能想到的唯一选择是编写两个独立的服务:

  1. 由计时器任务触发的一项服务
  2. 另一个使用ExecStop在系统关闭时执行的技巧的服务

我认为它应该有效,但这种方法有两个问题:

  1. 有很多关于安全设置的代码重复
  2. systemd 没有针对并行运行作业的保护。例如,如果在刚刚执行周期性作业时触发关闭,则两个作业将并行运行。

题:

  • 在系统关闭时定期和一次运行作业的最佳方法是什么?
  • 是否可以避免有两个(大部分是重复的)服务文件?

为了获得我对代码重复的理解,这些是我在运行作业时使用的一些安全设置:

User=foo
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes
NoNewPrivileges=yes
PrivateDevices=yes
PrivateUsers=yes
CapabilityBoundingSet=
AmbientCapabilities=
SystemCallFilter=~@clock @module @mount @obsolete @raw-io ptrace
ReadOnlyPaths=-/some/path
Run Code Online (Sandbox Code Playgroud)

在我的草图方法中,我需要复制此代码(每个服务一个副本)。

systemd systemd-timer

5
推荐指数
1
解决办法
556
查看次数

作为 systemd 服务运行时,rsync 命令不起作用

概括:

我正在尝试设置一个 systemd 计时器来使用该rsync命令定期备份目录。我创建了一个rsync在终端中手动运行时有效的命令,但在作为 systemd 计时器运行时它无法正常工作。

详细解释:

作为一个简单的例子,我有以下目录树/home/trevor/test_dir/

dir_a/
   file_a.png
dir_b/
   file_b.png
dir_c/
   file_c.png
Run Code Online (Sandbox Code Playgroud)

我想用来rsync将此目录复制到我的 SSD 中进行备份(安装在/my_ssd/)。但我想排除目录dir_adir_b. 所以我运行命令

dir_a/
   file_a.png
dir_b/
   file_b.png
dir_c/
   file_c.png
Run Code Online (Sandbox Code Playgroud)

当我从终端运行该命令时,该命令有效:它排除目录dir_adir_b,但保留dir_c.

接下来,我尝试创建一个 systemd 服务和计时器来定期运行该命令(请注意,我主要从Arch Linux Wiki 上的systemd/Timers 页面确定了以下步骤)。我制作以下服务文件

/etc/systemd/system/backup_test.service:

rsync -a --exclude={/dir_a,/dir_b} /home/trevor/test_dir/ /my_ssd/test_dir/
Run Code Online (Sandbox Code Playgroud)

以及以下计时器文件,该文件将每 30 秒运行一次命令(例如)

/etc/systemd/system/backup_test.timer:

[Unit]
Description=systemd backup test

[Service]
Type=simple
ExecStart=rsync -a --exclude={/dir_a,/dir_b} /home/trevor/test_dir/ /my_ssd/test_dir/
Run Code Online (Sandbox Code Playgroud)

我使用 启动计时器systemctl …

rsync systemd brace-expansion systemd-timer

5
推荐指数
1
解决办法
3457
查看次数

如何重置用户systemd计时器的剩余时间

如何重置用户 systemd 计时器的剩余时间?

\n

我有一个用户 systemd 服务:

\n
[Unit]\nDescription=Remind to a take break\n\n[Service]\nExecStart=/opt/scripts/break_reminder\nEnvironment=PATH=/sbin:/bin:/usr/bin:/usr/sbin:/opt/scripts\n\n[Install]\nWantedBy=default.target\n
Run Code Online (Sandbox Code Playgroud)\n

和一个用户 systemd 计时器

\n
[Unit]\nDescription=Remind to a take break\n\n[Timer]\nOnStartupSec=0min\nOnUnitActiveSec=30min\n\n[Install]\nWantedBy=timers.target\n
Run Code Online (Sandbox Code Playgroud)\n

编辑:\n通过重新启动和停止+启动重新启动计时器不会重置剩余时间。

\n
$ systemctl --user status break_reminder.timer \n\xe2\x97\x8f break_reminder.timer - Remind to take break\n     Loaded: loaded (/home/adam/.config/systemd/user/break_reminder.timer; enabled; vendor pr>\n     Active: active (waiting) since Sun 2021-05-30 16:19:00 CEST; 3h 48min ago\n    Trigger: Sun 2021-05-30 20:24:05 CEST; 16min left\n   Triggers: \xe2\x97\x8f break_reminder.service\n\nMay 30 16:19:00 archadam systemd[383]: Started Remind to take break.\n\n$ systemctl --user restart break_reminder.timer\n$ systemctl --user …
Run Code Online (Sandbox Code Playgroud)

systemd systemd-timer

5
推荐指数
1
解决办法
1204
查看次数

定期运行 btrfs-scrub

手册页btrfs-scrub说:

用户应该手动或通过定期系统服务运行它。建议的期限是一个月,但也可以更短。

对于systemd用户来说,这是如何自动化的,捕获日志中的所有输出?

我正在运行基于 Arch Linux 的 Manjaro。

arch-linux systemd btrfs manjaro systemd-timer

4
推荐指数
1
解决办法
2825
查看次数

“systemctl list-timers”显示远在未来的最后执行日期

当我运行时systemctl list-timers,上次执行的日期很远。例如,这是输出的一部分:

$ systemctl list-timers
NEXT                          LEFT                    LAST                          PASSED                  UNIT                         ACTIVATES
Sat 2017-08-19 02:29:16 CEST  6h left                 Wed 2017-08-16 02:50:57 CEST  2 days ago              systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
Sun 2092-06-29 22:30:00 CEST  74 years 10 months left Sun 2092-06-29 00:22:17 CEST  74 years 10 months left rsnapshot-daily.timer        rsnapshot@daily.service
Mon 2092-06-30 00:00:00 CEST  74 years 10 months left Sun 2092-06-29 00:22:17 CEST  74 years 10 months left fstrim.timer                 fstrim.service
Mon 2092-06-30 00:00:00 CEST  74 years 10 months left Sun 2092-06-29 00:22:17 …
Run Code Online (Sandbox Code Playgroud)

systemd systemd-timer

4
推荐指数
2
解决办法
2348
查看次数

Systemd Timer 在特定时间每分钟(使用一系列值)

我想要一个脚本每分钟运行一次,但在夜间停止执行它。

我试过

OnCalendar=*-*-* 05..00:*:00
Run Code Online (Sandbox Code Playgroud)

但这导致

Failed to parse calendar specification, ignoring: *-*-* 05..00:*:00
Timer unit lacks value setting. Refusing
Run Code Online (Sandbox Code Playgroud)

这里有什么问题?

systemd systemd-timer

4
推荐指数
1
解决办法
2927
查看次数

具有多个日历时刻的计时器

我正在使用 systemd 计时器和单元来自动触发备份作业。但目前它只在晚上的一个时刻运行。是否可以通过在同一个计时器中声明它来让它在多个时刻运行?

这是现在的样子:

[Unit]
Description=Run luky-borg-backup every night

[Timer]
OnCalendar=21:00
AccuracySec=1h
Persistent=yes

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

应该是这样的:

[Unit]
Description=Run luky-borg-backup every night

[Timer]
OnCalendar=10:00,21:00
AccuracySec=1h
Persistent=yes

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

systemd systemd-timer

4
推荐指数
2
解决办法
3389
查看次数

使用 .timer 单元重新启动 systemd .service

我有以下执行脚本的 systemd myscript.service 单元:

[Unit]
Description=MyScript
Wants=time-sync.target

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/local/bin/test.sh -a
ExecStop=/usr/local/bin/test.sh -b

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

我想使用以下 Systemd myscript.timer 单元每分钟重新启动它:

[Unit]
Description=Schedule script execution

[Timer]
OnCalendar=*:0/1

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

它只在第一次起作用,之后,状态保持为n/a:

# systemctl list-timers
NEXT                         LEFT        LAST                         PASSED      UNIT                         ACTIVATES
n/a                          n/a         Tue 2019-10-15 14:50:01 EDT  3ms ago     myscript.timer               myscript.service
Run Code Online (Sandbox Code Playgroud)

systemd services systemd-timer systemd-unit

4
推荐指数
1
解决办法
5458
查看次数