Systemd 作为 Linux 系统中功能强大的初始化程序,不仅可以管理系统服务,还可以用于创建定时执行的任务。本文将详细介绍如何使用 Systemd 的 Timer 单元配置定时任务。
Systemd timers的优势
与传统的 crontab 相比,使用 Systemd 管理定时任务,主要有以下优势:
(1) 统一的日志系统:日志自动汇集到journald,方便搜索和分析
(2) 资源控制能力:可以限制任务占用的CPU和内存等资源
(3) 模块化管理:依赖关系清晰,易于管理复杂任务
Timer 单元基本结构
Systemd 通过两类单元文件实现定时任务:
-
Timer单元:定义定时调度规则
-
Service单元:执行实际的任务内容
一般需要同时定义 Service 和 Timer 两个单元文件。
Service 单元结构如下:
[Unit]
Description=定时任务描述
[Timer]
OnUnitActiveSec=1h
Unit=任务service名称.service
[Install]
WantedBy=multi-user.target
主要通过OnUnitActiveSec 设置定时规则,Unit参数指定绑定的Service。
Timer 单元结构如下:
[Unit]
Description=任务描述
[Service]
ExecStart=命令或者脚本
Service部分指定实际执行的命令或脚本。
实例:监控网络流量
我们来实现一个实用的定时任务:每 10 分钟监控一次服务器流量使用情况,如果流入或流出带宽超过 10Mbps,则发送警告邮件。
首先,编写流量监控脚本 net_speed.sh:
#!/bin/bash
IN_SP=`sar -n DEV 1 1 | grep Average | awk '{print $5}'`
OUT_SP=`sar -n DEV 1 1 | grep Average | awk '{print $6}'`
if [ $IN_SP -gt 10000 -o $OUT_SP -gt 10000 ]; then
echo "Bandwidth exceeded ${IN_SP} kbit/s IN, ${OUT_SP} kbit/s OUT" | mail -s "Network flood warning" admin@local
fi
这个脚本使用 sar 命令每秒采样网络设备状态,如果超过带宽阈值则发送告警邮件。
对应的 Service 单元文件为 netwatch.service:
[Unit]
Description=Network Speed Monitor
[Service]
ExecStart=/usr/local/bin/net_speed.sh
然后是 Timer 单元文件 netwatch.timer:
[Unit]
Description=Run network watcher every 10m
[Timer]
OnUnitActiveSec=10m
Unit=netwatch.service
[Install]
WantedBy=multi-user.target
启动这个定时任务:
$ systemctl enable netwatch.timer
$ systemctl start netwatch.timer
后续可以通过 journalctl 查看全局日志,验证监控结果。
通过这个实例可以看出,使用 Systemd Timer 定制特定任务调度是很容易的,也易于日志和资源管理.
可以看到,使用 Systemd Timer 配置定时任务是非常简单直观的。常见的应用场景包括:
-
crontab任务迁移到Systemd
-
定期执行监控、数据处理、报表任务
-
基于时间驱动触发执行流程