Systemd定时器

Systemd定时器是一种Linux系统下的定时任务管理工具,可以用来替代传统的cron。本文介绍了如何列出所有定时器、查看开机自启动的定时器以及如何启用和配置定时器。例如,创建一个每天更新mlocate数据库的定时器,通过设置OnCalendar参数为daily来实现每日执行。此外,还提到了一些关键参数如AccuracySec和Persistent,用于控制定时任务的精度和持久性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Systemd定时器简介

https://www.ruanyifeng.com/blog/2018/03/systemd-timer.html


Systemd定时器常用命令

# 列出当前系统中所有活动的 systemd 定时器
systemctl list-timers
NEXTLEFTLASTPASSEDUNITACTIVATESDESCRIPTION
下一次定时器将触发的时间戳下一次定时器触发前还剩下的时间上一次定时器触发的时间戳从上一次定时器触发到现在经过的时间定时器单元的名称定时器关联的单元名称定时器描述信息

在这里插入图片描述

在这里插入图片描述


查看所有定时器单元

# 查看所有Timer单元
systemctl list-unit-files --type timer

在这里插入图片描述


查看开机自启动的定时器

# 查看开机自启动的定时器
systemctl list-unit-files --type timer --state enabled

在这里插入图片描述


自动运行指定定时器

# 自动运行指定定时器
systemctl enable myscript.timer

Systemd定时器示例

用定时器每月更新Unbound的root.hints

# /usr/lib/systemd/system/mlocate-updatedb.timer - mlocate 数据库更新定时器

[Unit]
# - 每天更新 mlocate 数据库的定时器
Description=Updates mlocate database every day 

[Timer]
# Unit 选项的默认值为与定时器同名的服务单元 /usr/lib/systemd/system/mlocate-updatedb.service;
# 因此该定时器会触发并启动 /usr/lib/systemd/system/mlocate-updatedb.service 服务单元。

# - 定时器每天运行一次
OnCalendar=daily
# - 最大推迟时间为 24小时 
AccuracySec=24h 
# - 如果定时器错过预定的运行时间,定时器将在系统下一次开机时运行
Persistent=true 

[Install]
# - 将定时器单元安装到 timers.target 中,以便系统会自动启动该定时器
WantedBy=timers.target 

定时器常用参数

参数解释
OnActiveSec定时器生效后,多少时间开始执行任务
OnBootSec系统启动后,多少时间开始执行任务
OnStartupSecSystemd 进程启动后,多少时间开始执行任务
OnUnitActiveSec该单元上次执行后,等多少时间再次执行
OnUnitInactiveSec定时器上次关闭后多少时间,再次执行
OnCalendar基于绝对时间,而不是相对时间执行
AccuracySec如果因为各种原因,任务必须推迟执行,推迟的最大秒数,默认是60秒
Unit真正要执行的任务,默认是同名的带有.service后缀的单元
Persistent如果设置了该字段,即使定时器到时没有启动,也会自动执行相应的单元
WakeSystem如果系统休眠,是否自动唤醒系统

自定义示例

# 创建定时器
vim /etc/systemd/system/${服务单元同名}.timer
  • 定时器配置内容:
[Unit]
# 单元描述:每天凌晨 3 点重启 edge 服务的定时器
Description=Timer to restart edge daily at 3 AM

[Timer]
# 定时触发时间:每天的 03:00:00
# 格式为:年-月-日 时:分:秒(星号表示“任意”)
OnCalendar=*-*-* 03:00:00

# 如果系统在预定时间关机,重启后会立刻补执行错过的任务
Persistent=true

[Install]
# 启用时将计时器绑定到 timers.target,使其随系统启动一起启动
WantedBy=timers.target
  • 启动定时器
# 冲在定时器
systemctl daemon-reload

# 启动定时器
systemctl enable --now ${服务单元同名}.timer

# 查看定时器状态
systemctl status edge.timer -l

# 查看所有定时器
systemctl list-timers --all
  • 查看定时器执行历史
# 查看特定定时器的日志
journalctl -u [timer-name]
<think>好的,我现在需要在Ubuntu系统上配置Systemd定时器,使用ntp工具每10分钟同步时间到ntp.aliyun.com。这个问题看起来涉及几个步骤,我得先理清楚流程。 首先,用户提到使用ntp工具,但Ubuntu默认可能使用timesyncd或者chrony。可能需要确认当前系统使用的是哪个时间服务。如果是ntpd的话,可能需要先安装。不过现在很多系统可能已经转向systemd-timesyncd,或者使用chrony作为替代。比如,Ubuntu 18.04之后可能默认使用systemd-timesyncd,但用户可能需要安装ntp包。我需要先检查是否安装了ntp,如果没有,安装它。 接下来,配置ntp服务器地址。ntp的配置文件通常是/etc/ntp.conf,需要编辑这个文件,添加server ntp.aliyun.com。可能需要注释掉原有的服务器地址,或者保留几个备用。不过用户要求只用ntp.aliyun.com,所以应该替换或添加这行。 然后,重启ntp服务,让配置生效。使用systemctl restart ntp或者ntpd,具体取决于服务名称。如果服务名不同,比如有的系统可能用ntp.service,或者需要检查服务状态是否正确。 接下来,设置Systemd定时器Systemd定时器需要两个部分:一个.service文件定义执行的任务,一个.timer文件定义触发时间。用户想要每10分钟运行一次,所以需要创建一个定时器单元,比如sync-time.timer,并设置OnUnitActiveSec=10m或者OnCalendar=*:0/10,但需要确认哪种方式更适合重复执行。 然后,创建对应的服务单元文件,比如sync-time.service,其中执行命令可能是/usr/sbin/ntpq -pn或者直接调用ntpdate?不过ntp通常是以服务形式运行,持续调整时间,而ntpdate是一次性同步。可能用户想要的是定期强制同步,这时候可能需要使用ntpdate命令,但需要注意ntpdate可能已经被弃用,或者需要单独安装。或者,如果使用ntpd,可能可以通过重启服务来触发同步,但这不是最佳做法。或者更好的方式可能是在服务文件中执行ntpd -gq,强制同步。需要具体查阅如何手动触发ntp同步。 或者,可能用户更简单的方式是直接使用systemd-timesyncd,但用户明确要求用ntp工具,所以可能需要用ntpd或者chrony。不过这可能会有冲突,如果同时运行多个时间服务的话。所以可能需要先停止并禁用systemd-timesyncd,然后启用ntp服务。 现在,假设已经正确配置了ntp.conf,并且ntp服务在运行,那么创建Systemd定时器来定期执行同步。可能正确的做法是定时重启ntp服务,或者使用ntpq命令触发同步。但不确定这样做是否有效。或者,可能需要编写一个脚本,调用ntpdate -u ntp.aliyun.com,然后通过服务单元来执行这个脚本,然后设置定时器每10分钟运行一次这个服务。不过ntpdate可能需要安装,并且需要确保在服务运行时网络可用。 可能用户需要安装ntpdate,然后在服务单元中执行ntpdate ntp.aliyun.com。例如: 在/etc/systemd/system/sync-time.service中: [Unit] Description=Sync time with ntp.aliyun.com [Service] ExecStart=/usr/sbin/ntpdate ntp.aliyun.com 然后,创建sync-time.timer: [Unit] Description=Run time sync every 10 minutes [Timer] OnCalendar=*:0/10 AccuracySec=1s Persistent=true [Install] WantedBy=timers.target 然后启用并启动定时器。不过需要注意,ntpdate需要安装,并且在现代Ubuntu版本中可能已经被chrony取代,或者需要额外安装。比如,可能需要运行sudo apt install ntpdate。 但另一个问题是,如果系统已经在运行ntpd服务,那么使用ntpdate可能会冲突,因为ntpd会调整时间,而ntpdate是立即同步。所以可能需要停止ntpd服务,再运行ntpdate,或者允许它们共存?或者用户可能希望使用ntpd本身的配置,让其定期同步,而无需Systemd定时器。但用户明确要求使用Systemd定时器配合ntp工具,所以可能需要强制定期同步,可能更好的方式是配置ntpd并让它自动处理,但用户可能希望额外增加定时触发。 或者,是否可以通过Systemd定时器来重启ntp服务,从而触发同步?比如,服务单元中执行systemctl restart ntp,但这样可能不太合适,因为频繁重启服务可能影响其正常运行。所以可能更稳妥的是通过ntpdate来执行一次同步,而不需要长时间运行的服务。 因此,步骤可能如下: 1. 安装ntpdate:sudo apt install ntpdate 2. 创建Systemd服务单元文件sync-time.service,执行ntpdate命令。 3. 创建对应的定时器单元文件sync-time.timer,设置每10分钟运行一次。 4. 启用并启动定时器。 另外,需要处理权限问题,因为ntpdate可能需要root权限,所以在服务单元中需要以Root身份运行。 同时,可能需要处理网络时间等待的问题,如果系统启动时网络未就绪,可能需要配置服务单元中的依赖,比如After=network.target。 总结步骤: - 安装必要的ntp工具(如ntp或ntpdate) - 配置ntp服务器地址到/etc/ntp.conf或直接通过ntpdate命令 - 创建Systemd服务单元和定时器单元 - 启用定时器并测试 需要验证是否正确,可能需要检查系统日志,使用journalctl -u sync-time.service和timer,查看同步是否成功。 可能还需要处理的问题包括:防火墙是否允许NTP流量(UDP 123端口),系统时区设置是否正确,以及是否有其他时间服务冲突。 最后,测试配置是否生效,可以使用timedatectl查看时间同步状态,或者使用ntpq -p查看ntp服务器状态。</think>### 在Ubuntu中配置Systemd定时器与NTP时间同步 #### 1. 安装NTP工具 若未安装`ntpdate`或`ntp`,需先安装: ```bash sudo apt update sudo apt install ntpdate # 或安装完整ntp包:sudo apt install ntp ``` #### 2. 配置NTP服务器 若使用`ntpdate`,直接通过命令指定服务器;若使用`ntp`服务,编辑配置文件: ```bash sudo nano /etc/ntp.conf ``` 在文件中添加或修改服务器地址: ``` server ntp.aliyun.com iburst ``` 保存后重启服务(仅限使用`ntp`服务时): ```bash sudo systemctl restart ntp ``` #### 3. 创建Systemd服务单元 新建服务文件`/etc/systemd/system/sync-time.service`: ```ini [Unit] Description=Sync time with ntp.aliyun.com After=network.target [Service] Type=oneshot ExecStart=/usr/sbin/ntpdate -u ntp.aliyun.com ``` 此处使用`ntpdate -u`强制立即同步[^1]。 #### 4. 创建Systemd定时器单元 新建定时器文件`/etc/systemd/system/sync-time.timer`: ```ini [Unit] Description=Run time sync every 10 minutes [Timer] OnCalendar=*:0/10 # 每10分钟触发一次 AccuracySec=1s Persistent=true [Install] WantedBy=timers.target ``` #### 5. 启用并启动定时器 ```bash sudo systemctl daemon-reload sudo systemctl enable sync-time.timer sudo systemctl start sync-time.timer ``` #### 6. 验证配置 - 查看定时器状态: ```bash systemctl list-timers sync-time.timer ``` - 检查同步日志: ```bash journalctl -u sync-time.service ``` #### 注意事项 1. 若使用`ntp`服务,需禁用默认的`systemd-timesyncd`: ```bash sudo systemctl stop systemd-timesyncd sudo systemctl disable systemd-timesyncd ``` 2. 确保防火墙开放UDP 123端口[^2]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

教Linux的李老师

赞赏是第一生产力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值