Systemd timers简易教程 - 使用Systemd timers取代cronjob

2023-12-06

Systemd 作为 Linux 系统中功能强大的初始化程序,不仅可以管理系统服务,还可以用于创建定时执行的任务。本文将详细介绍如何使用 Systemd 的 Timer 单元配置定时任务。

Systemd timers的优势

与传统的 crontab 相比,使用 Systemd 管理定时任务,主要有以下优势:

(1) 统一的日志系统:日志自动汇集到journald,方便搜索和分析

(2) 资源控制能力:可以限制任务占用的CPU和内存等资源

(3) 模块化管理:依赖关系清晰,易于管理复杂任务

Timer 单元基本结构

Systemd 通过两类单元文件实现定时任务:

一般需要同时定义 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 配置定时任务是非常简单直观的。常见的应用场景包括:

参考资料

  1. systemd/定时器 - ArchWiki
  2. Systemd 定时器教程 - 阮一峰的网络日志