共计 4245 个字符,预计需要花费 11 分钟才能阅读完成。
这篇文章的内容主要围绕在 Linux 系统下使用 Systemd 定时器的基础是什么进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随丸趣 TV 小编一起阅读吧。希望大家通过这篇文章有所收获!
下面介绍用于调度任务的 Systemd 定时器(Systemd Timer),也是一篇在 Linux 系统下使用 Systemd 定时器的基础文章。将展示如何在 Systemd 中使用定时器在系统启动后并在此后重复运行任务。当前 Systemd 已经提供了一段时间的定时器,作为 cron 的替代品,该功能值得一看。
Cron vs anacron vs systemd
Cron 可以安排任务以从几分钟到几个月或更长时间的运行。设置相对简单,只需要一个配置文件。虽然配置行有点深奥,不过一般用户也可以使用。
但是,如果您的系统在适当的执行时间发生时没有运行,则 Cron 会失败。
Anacron,克服了“系统未运行”的问题。它确保当您的系统再次处于活动状态时将执行任务。虽然它旨在供管理员使用,但某些系统为一般用户提供访问权限。
但是,执行的 anacron 频率可以不少于每天。
cron 和 anacron 都存在执行上下文的一致性问题。必须注意任务运行时有效的环境与测试时使用的环境完全相同。必须提供相同的 shell、环境变量和路径。这意味着测试和调试有时会很困难。
Systemd 定时器提供了 cron 和 anacron 的最佳功能。允许调度到分钟粒度。确保任务将在系统再次运行时执行,即使它在预期的执行时间内关闭。可供所有用户使用。您可以在它将运行的环境中测试和调试执行。
但是配置比较复杂,至少需要两个配置文件。
如果您的 cron 和 anacron 配置很好地为您服务,那么可能没有理由改变。但 systemd 至少值得研究,因为它可以简化任何当前的 cron /anacron 解决方法。
参考:在 Linux 系统下使用 Crontab UI 安全管理 Cron 定时任务。
配置
Systemd 定时器执行的函数至少需要两个文件。它们是“timer unit”和“service unit”。操作不仅仅是一个简单的命令,您还需要一个“job”文件或脚本来执行必要的功能。
定时器单元文件定义调度,而服务单元文件定义执行的任务。有关.timer 单元的更多详细信息,请参阅“man systemd.timer”。有关服务单元的详细信息,请参见“man systemd.service”。
单元文件存在于多个位置(在手册页中列出)。然而,对于一般用户来说,最简单的位置可能是“~/.config/systemd/user”。请注意,此处的“user”是文字字符串“user”。
示例
这个示例是一个简单的例子,创建一个用户计划作业而不是系统计划作业(它将以 root 身份运行)。它将消息、日期和时间打印到文件中。
1、首先创建一个将执行任务的 shell 脚本。在本地“bin”目录中创建它,例如,在“~/bin/schedule-test.sh”。
要创建文件:
touch ~/bin/schedule-test.sh
然后将以下内容添加到您刚刚创建的文件中:
#!/bin/sh
echo This is only a test: $(date) $HOME/schedule-test-output.txt
请记住使您的 shell 脚本可执行。
2、创建将调用上述脚本的.service 单元。在“~/.config/systemd/user/schedule-test.service”位置创建目录和文件:
[Unit]
Description=A job to test the systemd scheduler
[Service]
Type=simple
ExecStart=/home/ user /bin/schedule-test.sh
[Install]
WantedBy=default.target
请注意,user 应该是您的 @HOME 地址,但单元文件路径名中的“user”实际上是字符串“user”。
ExecStart 行应该提供一个没有变量的绝对地址。一个例外是,对于用户单位,您可以将“%h”替换为 $HOME。换句话说,您可以使用:
ExecStart=%h/bin/schedule-test.sh
这仅用于用户单元文件使用。这对系统单元不利,因为“%h”在系统环境中运行时将始终返回“/root”。其他替换在“man systemd.unit”中的“SPECIFIERS”标题下找到。由于它超出了本文的范围,这就是我们现在需要了解的有关 SPECIFIERS 的全部内容。
3、创建一个.timer 单元文件,它实际调度您刚刚创建的.service 单元。在与.service 文件“~/.config/systemd/user/schedule-test.timer”相同的位置创建它。请注意,文件名仅在扩展名上有所不同,即“.service”与“.timer”:
[Unit]
Description=Schedule a message every 1 minute
RefuseManualStart=no # Allow manual starts
RefuseManualStop=no # Allow manual stops
[Timer]
#Execute job if it missed a run due to machine being off
Persistent=true
#Run 120 seconds after boot for the first time
OnBootSec=120
#Run every 1 minute thereafter
OnUnitActiveSec=60
#File describing job to execute
Unit=schedule-test.service
[Install]
WantedBy=timers.target
请注意,.timer 文件已使用“OnUnitActiveSec”来指定时间表。“OnCalendar”选项更加灵活。例如:# run on the minute of every minute every hour of every day
OnCalendar=*-*-* *:*:00
# run on the hour of every hour of every day
OnCalendar=*-*-* *:00:00
# run every day
OnCalendar=*-*-* 00:00:00
# run 11:12:13 of the first or fifth day of any month of the year
# 2012, but only if that day is a Thursday or Friday
OnCalendar=Thu,Fri 2021-*-1,5 11:12:13
4、所有部分都已就位,但您应该进行测试以确保一切正常。首先,启用用户服务:
$ systemctl –user enable schedule-test.service
这应该会产生类似于以下内容的输出:
Created symlink /home/ user /.config/systemd/user/default.target.wants/schedule-test.service rarr; /home/ user /.config/systemd/user/schedule-test.service.
现在对作业进行测试运行:
$ systemctl –user start schedule-test.service
检查您的输出文件 ($HOME/schedule-test-output.txt) 以确保您的脚本是正确执行。因为我们还没有启动定时器,所以应该有一个条目。根据需要进行调试。如果您需要更改.service 文件而不是它调用的 shell 脚本,请不要忘记再次启用该服务。
5、作业正常工作后,通过为您的服务启用和启动用户定时器来实时安排它:
$ systemctl –user enable schedule-test.timer
$ systemctl –user start schedule-test.timer
请注意,您已经在上面的步骤 4 中启动并启用了该服务,因此只需为其启用和启动定时器即可。
“enable”命令将导致类似以下的输出:
Created symlink /home/ user /.config/systemd/user/timers.target.wants/schedule-test.timer rarr; /home/ user /.config/systemd/user/schedule-test.timer.
并且“start”只会让您返回到 CLI 提示符。
其他操作
您可以检查和监控服务。如果您收到来自服务单元的错误,下面的第一个命令特别有用:
$ systemctl –user status schedule-test
$ systemctl –user list-unit-files
手动停止服务:
$ systemctl –user stop schedule-test.service
永久停止和禁用定时器和服务,重新加载守护程序配置并重置任何失败通知:
$ systemctl --user stop schedule-test.timer
$ systemctl --user disable schedule-test.timer
$ systemctl --user stop schedule-test.service
$ systemctl --user disable schedule-test.service
$ systemctl --user daemon-reload
$ systemctl --user reset-failed
什么是 Linux 系统
Linux 是一种免费使用和自由传播的类 UNIX 操作系统,是一个基于 POSIX 的多用户、多任务、支持多线程和多 CPU 的操作系统,使用 Linux 能运行主要的 Unix 工具软件、应用程序和网络协议。
感谢你的阅读,相信你对“在 Linux 系统下使用 Systemd 定时器的基础是什么”这一问题有一定的了解,快去动手实践吧,如果想了解更多相关知识点,可以关注丸趣 TV 网站!丸趣 TV 小编会继续为大家带来更好的文章!