我将一些 cron 作业转换为systemd.timer单位,并希望发送有关每个作业失败和成功的邮件。
优秀的ArchLinux wiki 页面提供了相关信息,并且设置在失败时也能顺利运行。现在我想在单元成功运行时添加电子邮件通知,但根据systemd.unit没有名为OnSuccess=的配置的配置。
如何处理这个用例?
我使用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
谢谢。
我想定期(例如,每 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)
但我很难将这两种方法结合起来。我能想到的唯一选择是编写两个独立的服务:
ExecStop
在系统关闭时执行的技巧的服务我认为它应该有效,但这种方法有两个问题:
题:
为了获得我对代码重复的理解,这些是我在运行作业时使用的一些安全设置:
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 计时器来使用该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_a
和dir_b
. 所以我运行命令
dir_a/
file_a.png
dir_b/
file_b.png
dir_c/
file_c.png
Run Code Online (Sandbox Code Playgroud)
当我从终端运行该命令时,该命令有效:它排除目录dir_a
和dir_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 …
如何重置用户 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) 手册页btrfs-scrub
说:
用户应该手动或通过定期系统服务运行它。建议的期限是一个月,但也可以更短。
对于systemd
用户来说,这是如何自动化的,捕获日志中的所有输出?
我正在运行基于 Arch Linux 的 Manjaro。
当我运行时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) 我想要一个脚本每分钟运行一次,但在夜间停止执行它。
我试过
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 计时器和单元来自动触发备份作业。但目前它只在晚上的一个时刻运行。是否可以通过在同一个计时器中声明它来让它在多个时刻运行?
这是现在的样子:
[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 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 ×10
systemd-timer ×10
arch-linux ×1
btrfs ×1
manjaro ×1
rsync ×1
services ×1
systemd-unit ×1