[Linux] 利用systemd实现周期性执行任务(DDNS设置案例)
利用systemd实现周期性执行任务
文章目录
- 利用systemd实现周期性执行任务
- 一、引言
- 二、systemd定时任务基础
- 1. systemd.timer单元的基本概念和工作原理
- 2. systemd.timer与cron的异同对比
- 3. systemd.timer支持的时间规范格式
- 三、创建systemd定时任务
- 四、管理与监控定时任务
- 1. 定时任务的基本管理操作
- 2. 定时任务状态监控
- 3. 日志查看与分析
- 4. 高级监控技巧
- 5. 常见问题排查
- 五、实际应用案例(DDNS设置)
- 1. 创建DDNS更新脚本(`.sh`脚本)
- 2. 创建服务文件(`.service` 单元)
- 3. 创建定时器文件(`.timer` 单元)
- 4. 启用并启动定时器
- 5. 验证定时器状态
- 6.关键说明
- 7. 总结
一、引言
在当今的Linux生态系统中,systemd已成为大多数主流发行版(如Ubuntu、Fedora、Debian和CentOS)默认采用的初始化系统和服务管理器。它不仅负责系统的启动流程,还提供了服务管理、日志记录、设备管理以及定时任务等丰富的功能。相较于传统的SysV init,systemd通过并行化启动、依赖管理和单元(Unit)配置,显著提升了系统初始化的效率和灵活性。
其中,systemd的定时任务功能(通过systemd.timer
实现)为系统管理员和开发者提供了一种现代、可靠的替代方案,以取代传统的cron。与cron相比,systemd.timer具有如下优势:
- 精确的时间控制:支持日历事件(如"每周一 9:00")和相对时间(如"每30分钟"),且语法更清晰。
- 依赖管理:可以与其他systemd单元(如服务)绑定,确保任务仅在特定条件满足时执行。
- 日志集成:通过
journalctl
统一查看任务日志,避免cron分散的邮件或文件日志。 - 资源隔离:支持为任务分配资源限制(如CPU、内存),避免单个任务影响系统稳定性。
本文将详细介绍如何利用systemd.timer
配置和管理定时任务,涵盖以下核心内容:
- systemd.timer的基本概念与语法
- 创建和配置定时任务的步骤
- 实际应用场景与示例(如日志轮转、备份脚本)
- 调试与日志查看技巧
- 与传统cron的对比与迁移建议
通过本文,读者将掌握如何高效、可靠地利用systemd管理定时任务,适应现代Linux系统的发展趋势。
二、systemd定时任务基础
1. systemd.timer单元的基本概念和工作原理
systemd.timer是一种特殊的systemd单元,专门用于定时触发其他服务或程序。它的工作原理基于以下核心机制:
- 每个.timer文件都关联一个对应的.service文件
- 当满足预定义的时间条件时,systemd会启动关联的服务
- 支持精确到毫秒级的时间触发
- 采用单调时钟(monotonic clock)而非挂钟时间(wall clock)
典型的timer单元包含以下关键配置项:
[Timer]
OnCalendar=*-*-* 00:00:00 # 每天午夜执行
Unit=backup.service # 关联的服务单元
Persistent=true # 允许补偿错过的执行
2. systemd.timer与cron的异同对比
相同点:
- 都能实现定时任务调度
- 都支持按固定时间间隔执行任务
- 都可以设置环境变量
不同点对比:
特性 | systemd.timer | cron |
---|---|---|
精度 | 毫秒级 | 分钟级 |
依赖关系 | 支持服务依赖 | 不支持 |
日志记录 | 集成journald日志 | 独立日志文件 |
资源控制 | 支持cgroup限制 | 不支持 |
时间规范 | 更灵活的时间表达式 | 固定格式 |
错误处理 | 有重试机制 | 简单执行 |
临时修改 | 需要reload | 直接编辑文件 |
应用场景选择建议:
- 需要精确控制执行时间的选systemd.timer
- 简单的脚本定时执行可用cron
- 需要资源限制的任务用systemd.timer
- 跨系统兼容性要求高时用cron
3. systemd.timer支持的时间规范格式
systemd.timer提供了多种灵活的时间规范方式:
1. 日历时间表达式(OnCalendar)
*-*-* 02:30:00 # 每天2:30
Mon *-*-* 09:00:00 # 每周一9点
*-*-01 00:00:00 # 每月1号
2025-06-01 12:00:00 # 特定日期
2. 相对时间表达式
OnBootSec=5min # 启动后5分钟
OnUnitActiveSec=1h # 上次激活后1小时
OnStartupSec=15s # systemd启动后15秒
3. 混合表达式
可以组合多个时间条件:
OnCalendar=Mon..Fri 08:00:00
OnBootSec=0
4. 特殊时间关键字
hourly # 每小时
daily # 每天
weekly # 每周
monthly # 每月
yearly # 每年
5. 随机延迟(RandomizedDelaySec)
RandomizedDelaySec=30m # 在指定时间内随机延迟
示例组合:
[Timer]
OnCalendar=*-*-* 04:00:00
RandomizedDelaySec=1h
Unit=maintenance.service
这种灵活的时间规范方式使得systemd.timer可以满足各种复杂的定时任务需求,从简单的定期执行到精确的定时触发都能完美支持。
三、创建systemd定时任务
- 编写.service单元文件定义要执行的任务
[Unit]
Description=My Periodic Task[Service]
Type=simple
ExecStart=/path/to/command
- 编写.timer单元文件配置触发时间
[Unit]
Description=Run My Task Daily[Timer]
OnCalendar=daily
Persistent=true[Install]
WantedBy=timers.target
四、管理与监控定时任务
1. 定时任务的基本管理操作
在Linux系统中,使用systemd管理的定时任务可以通过systemctl命令进行管理。以下是常用操作:
- 启动定时任务:
systemctl start mytask.timer
启动后,定时任务会立即激活并按照预定的时间计划执行。
- 设置开机自启:
systemctl enable mytask.timer
这样设置后,定时任务会在系统启动时自动加载,无需手动启动。
- 停止定时任务:
systemctl stop mytask.timer
停止后,定时任务将不再触发执行。
- 禁用开机自启:
systemctl disable mytask.timer
2. 定时任务状态监控
- 查看所有定时任务状态:
systemctl list-timers --all
这会显示系统中所有的定时任务信息,包括:
-
下次触发时间(NEXT)
-
上次触发时间(LAST)
-
任务间隔(UNIT)
-
激活状态(ACTIVATES)
-
查看特定定时任务详情:
systemctl status mytask.timer
可以查看该定时任务的详细配置和当前运行状态。
3. 日志查看与分析
- 查看任务执行日志:
journalctl -u mytask.service
这会显示该定时任务关联服务(mytask.service)的所有执行日志。
- 实时监控日志:
journalctl -u mytask.service -f
使用-f参数可以实时跟踪日志输出,方便调试。
- 按时间筛选日志:
journalctl -u mytask.service --since "2023-01-01" --until "2023-01-02"
可以查看特定时间段的执行记录。
4. 高级监控技巧
- 查看任务执行耗时:
systemd-analyze blame
可以帮助识别执行时间过长的任务。
- 图形化监控工具:
对于桌面环境,可以使用:
systemd-cgls
或者安装cockpit等工具进行可视化监控。
5. 常见问题排查
如果定时任务没有按预期执行:
- 检查timer单元是否激活:
systemctl is-active mytask.timer
- 检查依赖关系:
systemctl list-dependencies mytask.timer
- 检查系统时间是否正确:
timedatectl status
定时任务的管理和监控是系统维护的重要环节,合理使用这些命令可以确保任务按计划执行并及时发现问题。
五、实际应用案例(DDNS设置)
该案例适用于需要保持稳定远程访问的家庭NAS、监控系统或小型服务器等场景。由于ISP提供的动态IP地址会定期变更(通常24-48小时强制更换一次),通过定时更新DDNS记录可确保域名始终解析到最新IP地址。
1. 创建DDNS更新脚本(.sh
脚本)
以f3322的DDNS为例,其更新IP的脚本ddns.sh
如下:
lynx -mime_header -auth=账号:密码"http://members.3322.net/dyndns/update?system=dyndns&hostname=你的域名" >> /var/log/f3322/f3322_update.log
2. 创建服务文件(.service
单元)
将服务类型改为 oneshot
(表示执行一次后退出):
# /etc/systemd/system/my-script.service
[Unit]
Description=My Custom Script (30min Timer)[Service]
Type=oneshot
ExecStart= /path/to/ddns.sh #指定执行更新ddns的脚本文件,根据实际情况修改
User=yourusername # 可选:指定运行用户
RemainAfterExit=no # 任务完成后标记为完成
3. 创建定时器文件(.timer
单元)
新建一个 .timer
文件(与 .service
同名,后缀不同):
# /etc/systemd/system/my-script.timer
[Unit]
Description=Run my-script every 30 minutes[Timer]
# 两种方式任选其一:
# 方式 1:按固定时间间隔(从上次任务完成开始计算)
OnUnitActiveSec=30m# 方式 2:按绝对时间点(每小时的第 0/30 分钟)
# OnCalendar=*:0/30# 如果系统休眠后需要补执行错过的任务
Persistent=true[Install]
WantedBy=timers.target
4. 启用并启动定时器
# 重新加载 systemd 配置
sudo systemctl daemon-reload# 启用定时器(开机自启)
sudo systemctl enable my-script.timer# 立即启动定时器
sudo systemctl start my-script.timer
5. 验证定时器状态
# 查看所有活跃定时器
systemctl list-timers# 查看定时器日志
journalctl -u my-script.service -u my-script.timer
6.关键说明
OnUnitActiveSec=30m
:从上次任务完成开始计算间隔 30 分钟。OnCalendar=*:0/30
:在每小时的00:00
和00:30
执行(绝对时间)。- 如果脚本需要网络或挂载点(如
/E
),在[Unit]
中添加依赖:[Unit] After=network.target mnt-E.mount Requires=network-online.target
7. 总结
如果你想执行别的任务或者脚本,只需按这个套路,将.service
单元中指定的需要执行的脚本替换掉就行,so easy!
研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)
相关文章:
[Linux] 利用systemd实现周期性执行任务(DDNS设置案例)
利用systemd实现周期性执行任务 文章目录 利用systemd实现周期性执行任务一、引言二、systemd定时任务基础1. systemd.timer单元的基本概念和工作原理2. systemd.timer与cron的异同对比3. systemd.timer支持的时间规范格式 三、创建systemd定时任务四、管理与监控定时任务1. 定…...
maven 3.0多线程编译提高编译速度
mvn package 默认只使用 单线程 来执行构建生命周期(即顺序地构建每一个模块)。 如果你使用的是多模块项目,Maven 从 3.0 开始提供了**并行构建(parallel build)**的能力,但它不是默认开启的。 如何启用多…...
Dalvik虚拟机、ART虚拟机与JVM的核心区别
一、架构设计差异 指令集架构 JVM:基于栈结构,所有操作(如算术运算、方法调用)均依赖操作数栈完成,指令集紧凑但执行效率较低(需频繁内存交互)。Dalvik&#x…...
Unity 3D AssetBundle加密解密教程
前言 在Unity中加密和解密AssetBundle可以保护你的资源不被未经授权的访问或篡改。以下是详细的步骤和示例代码: 对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀! 1. 加密AssetBundle 步骤&…...

【Linux】shell脚本的常用命令
目录 简介 一.设置主机名称 1.1通过文件修改 1.2通过命令修改 二.网络管理命令nmcli 2.1查看网卡 2.2设置网卡 三.简单处理字符 3.1seq打印连续字符 3.2printf,echo打印字符 3.3sort排序 3.4uniq冗余处理 3.5cut对字符的截取 四.xargs输入转参 简介 以下命令都是…...
Netty应用:从零搭建Java游戏服务器网络框架
在游戏开发领域,服务器网络框架是连接玩家与游戏世界的桥梁,其稳定性和高效性直接影响玩家的游戏体验。本文将详细介绍如何使用Java语言和Netty框架,搭建一个兼具TCP和UDP协议支持的游戏服务器网络框架,并配套开发客户端,助你快速掌握游戏网络开发的核心技术。 1.项目概览…...

Pycharm and Flask 的学习心得(9)
request对象: 1. request包含前端发送过来的所有请求数据 将from表单里的内容CV到request里面,可以添加if语句来做判断出请求类型后的操作 在网页上的表单上input的数据,后端如何获取呢? request对象获取前端发送来的数据 // …...

Linux初始-环境安装(2)
文章目录 安装问题(1-1.51.39)xshell的下载和登录步骤xshell创建多用户与删除用户xshell免密码登录 简介:这篇文章我认为对于初学Linux还是非常重要的,正所谓磨刀不误砍柴工,工具环境准备好了,后面的学习才…...
Nginx 安全防护与 HTTPS 部署实战笔记
Nginx 安全防护与 HTTPS 部署实战笔记 一、核心安全配置 (一)编译安装 Nginx 安装支持软件 dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar作用:安装 Nginx 编译所需的开发包&#…...

Python Day34 学习
今日内容 通过“心脏病数据集”对之前的内容进行复习,再进行新内容“元组和OS模块”的学习。 机器学习模型建模和评估(先不考虑调参) 基于之前已经预处理过的心脏病数据集 划分数据值 模型训练与模型评估 # 随机森林 rf_model RandomFo…...

【ASR】基于分块非自回归模型的流式端到端语音识别
论文地址:https://arxiv.org/abs/2107.09428 摘要 非自回归 (NAR) 模型在语音处理中越来越受到关注。 凭借最新的基于注意力的自动语音识别 (ASR) 结构,与自回归 (AR) 模型相比,NAR 可以在仅精度略有下降的情况下实现有前景的实时因子 (RTF) 提升。 然而,识别推理需要等待…...

国芯思辰|国产FRAM SF25C128助力监控系统高效低功耗解决方案,对标MB85RS128/FM25V01
监控系统已成为保障公共安全、维护社会秩序的重要工具。随着监控系统的不断发展,对数据存储的要求也越来越高,不仅需要大容量、高速度的存储设备,还要求其具备高可靠性和低功耗等特性。国产铁电存储器 SF25C128作为一种新型非易失性存储器&am…...

攻防世界逆向刷题笔记(新手模式9-1?)
bad_python 看样子是pyc文件损坏了。利用工具打开,发现是MAGIC坏了。搜下也没有头绪。 攻防世界-难度1- bad_python - _rainyday - 博客园 python Magic Number对照表以及pyc修复方法 - iPlayForSG - 博客园 看WP才知道36已经提示了pyc版本了。参考第二个文章&am…...
【golang】能否在遍历map的同时删除元素
Go 团队在设计时确实允许在迭代时删除当前元素,但是不建议直接使用 for k, v : range m 删除。对于单线程读写情况: 主要原因如下: 1. 迭代变量重用问题 Go 的 range 循环会重用迭代变量的内存地址。当你使用 for k, v : range m 时…...

制作一款打飞机游戏58:子弹模式组合
今天我们将继续深入探讨子弹模式系统,并在我们的模式编辑器上做一些收尾工作。 子弹模式系统的乐趣 首先,我想说,这个子弹模式系统真的非常有趣。看着屏幕上不断喷射的子弹,感觉真是太棒了! 合并修饰符 今天&#…...

使用新一代达梦管理工具SQLark,高效处理 JSON/XML 数据!
在应用开发领域,JSON/XML数据结构因其灵活性和通用性,成为开发者存储和交换数据的首选。然而,传统管理工具在处理这些半结构化数据时,往往存在可视化效果差、编辑效率低等问题,严重影响开发者的工作效率。 现在&#…...
Qt基础:数据容器类
数据容器类 1. QList1.1 使用创建和初始化添加和删除元素访问和修改元素查找和判断元素遍历列表排序和筛选与其他容器的转换 1.2 完整示例 1. QList 在Qt中,QList 是一个动态数组容器类,用于存储和管理相同类型的元素。它提供了快速随机访问、动态扩展和…...
Vue3监听对象数组属性变化方法
在Vue3中,监听对象数组中某个属性的变化可以通过以下几种方法实现: 方法一:深度监听整个数组并比较属性变化 使用 watch 函数并启用 deep: true,在回调中遍历比较新旧数组的特定属性。 javascript 复制 下载 import { ref, …...

深入了解PyTorch:起源、优势、发展与安装指南
深入了解PyTorch:起源、优势、发展与安装指南 目录 引言PyTorch简介PyTorch的优势 动态计算图直观易用的API强大的社区支持丰富的生态系统高性能与可扩展性 PyTorch的发展历程PyTorch的主要组件 Torch.TensorAutograd自动求导nn模块TorchvisionTorchText和TorchAu…...

DeepSeek智能对话助手项目
目录: 1、效果图2、实现代码3、温度和TopK的作用对比 1、效果图 2、实现代码 # import gradio as gr# def reverse_text(text): # return text[::-1]# demogr.Interface(fnreverse_text,inputs"text",outputs"text")# demo.launch(share&q…...

浅谈Mysql的MVCC机制(RC与RR隔离级别)
MVCC(Multi-Version Concurrency Control)多版本并发控制 说这个我们先来了解一下Mysql的隔离级别,因为MVCC和Mysql的隔离级别是有关的。 Mysql默认的隔离级别是RR(可重复读) 其他的隔离级别是读未提交(…...

uniapp-商城-72-shop(5-商品列表,购物车实现回顾)
我们通过前面的章节已经将数据添加到了购物车,但实际上购物车的处理还有很多东西需要完成。 我们看看如何将商品添加到购物车。 本文介绍了购物车功能的实现方式,重点讲解了如何将商品添加到购物车以及购物车状态管理的处理机制。主要内容包括:1. 通过Vuex管理购物车状态,包…...
【git】 pull + rebase 或 pull + merge什么区别?
在Git中,pull + rebase 和 pull + merge 是两种整合远程分支更新的方式,其核心区别在于如何处理提交历史。以下是详细对比: 核心区别 操作提交历史结构合并方式冲突处理适用场景pull + merge保留分支分叉和合并节点创建新的合并提交(Merge Commit)一次性解决所有冲突公共…...
1. 编程语言进化史与JavaScript
引言 作为一名开发者,理解编程语言的演进历史和核心特性是至关重要的。接下来将从编程语言的三个历史阶段入手,重点解析JavaScript的起源、特性及其与相关技术的关系,同时补充进制转换的基础知识,为初学者构建完整的知识体系。 一、编程语言的三大历史阶段 1. 机器语言(…...
Vue3 中 Axios 深度整合指南:从基础到高级实践引言
在现代前端开发中,与后端API的交互是构建动态应用的核心环节。Axios作为最流行的HTTP客户端之一,以其简洁的API和强大的功能在前端生态中占据重要地位。本文将全面探讨如何在Vue3项目中高效整合Axios,从基础配置到高级封装,从性能…...

MySQL#Select语句执行过程
服务端程序架构 MySQL 是典型的 C/S 架构,即 Client/Server 架构,服务器端程序mysqld。 Select语句执行过程 连接层 客户端和服务器端建立连接,客户端发送 SQL 至服务器端 SQL层 SQL语句处理 查询缓存: 缓存命中该SQL执行结果直…...

hbuilder中h5转为小程序提交发布审核
【注意】 [HBuilder] 11:59:15.179 此应用 DCloud appid 为 __UNI__9F9CC77 ,您不是这个应用的项目成员。1、联系这个应用的所有者,请求加入项目成员(https://dev.dcloud.net.cn "成员管理"-"添加项目成员")…...
文档注释:删还是不删
问题:代码中存在大量的文档注释,占用大量篇幅,一次难以看完整个文件,于是诞生了一个想法:删除所有文档注释,于是问了下 DeepWiki 文档注释对tree - sitter有影响吗?文档注释对Roocode大模型理解…...

【数据结构】单链表练习
1.链表的中间节点 https://leetcode.cn/problems/middle-of-the-linked-list/description/ 用快慢指针来解决 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* middleNode(struct ListNode* he…...
JVM 性能优化终极指南:全版本兼容、参数公式与场景实战
一、引言 JVM 优化的核心难点在于版本兼容性与场景适配性。从 Java 8 到 Java 21,JVM 的内存模型、GC 策略和默认参数发生了巨大变化;从高并发 Web 到大数据批处理,不同业务场景对延迟、吞吐量的要求也截然不同。本文基于历史会话中用户关注…...