Systemd 定时器教程 - 阮一峰的网络日志

TL;DR

Systemd 是 Linux 的系统启动器,提供了定时任务功能。定时任务可以预定在未来的某个或多个时点执行的任务,具有自动生成日志、设置内存和 CPU 使用额度、任务可以拆分、依赖其他 Systemd 单元等优点。邮件脚本可以发送电子邮件,使用 bash 脚本,调用 mail 命令。Systemd 单元是 Systemd 的最小功能单位,是单个进程的描述,分为 12 种,包括 Service、Timer、Slice 等。单元管理命令包括启动单元、关闭单元、重启单元、杀死单元进程、查看单元状态、开机自动执行、关闭开机自动执行等。Service 单元定义所要执行的任务,Timer 单元定义定时执行 Service。[Install] 和 target 定义开机自启动和关闭开机自启动时,所要执行的命令。定时器相关命令包括启动定时器、查看定时器状态、查看所有定时器、关闭定时器、开机自动运行定时器、关闭定时器开机自启动等。日志相关命令包括查看整个日志、查看 mytimer.timer 日志、查看 mytimer.timer 和 mytimer.service 日志、从结尾开始查看最新日志、从结尾开始查看 mytimer.timer 日志等。

Summary

  1. Systemd 简介:Systemd 是 Linux 的系统启动器,功能强大,提供了定时任务功能。

  2. 定时任务
    • 定义:预定在未来的某个或多个时点执行的任务。
    • 优点:自动生成日志,设置内存和 CPU 使用额度,任务可以拆分,依赖其他 Systemd 单元。
  3. 邮件脚本
    • 功能:发送电子邮件。
    • 实现:使用 bash 脚本,调用 mail 命令。
  4. Systemd 单元
    • 定义:Systemd 的最小功能单位,是单个进程的描述。
    • 种类:有 12 种,包括 Service、Timer、Slice 等。
    • 单元描述文件:分散在三个目录,/lib/systemd/system、/etc/systemd/system、/usr/lib/systemd/system。
  5. 单元管理命令
    • 启动单元:systemctl start [UnitName]
    • 关闭单元:systemctl stop [UnitName]
    • 重启单元:systemctl restart [UnitName]
    • 杀死单元进程:systemctl kill [UnitName]
    • 查看单元状态:systemctl status [UnitName]
    • 开机自动执行:systemctl enable [UnitName]
    • 关闭开机自动执行:systemctl disable [UnitName]
  6. Service 单元
    • 定义:所要执行的任务。
    • 实现:新建 Service 文件,写入 ExecStart、ExecStop、ExecReload 等字段。
  7. Timer 单元
    • 定义:定时执行 Service。
    • 实现:新建 Timer 文件,写入 OnUnitActiveSec、OnBootSec、OnStartupSec 等字段。
  8. [Install] 和 target
    • 定义:开机自启动和关闭开机自启动时,所要执行的命令。
    • 实现:写入 WantedBy 字段,指定 target。
  9. 定时器相关命令
    • 启动定时器:systemctl start mytimer.timer
    • 查看定时器状态:systemctl status mytimer.timer
    • 查看所有定时器:systemctl list-timers
    • 关闭定时器:systemctl stop myscript.timer
    • 开机自动运行定时器:systemctl enable myscript.timer
    • 关闭定时器开机自启动:systemctl disable myscript.timer
  10. 日志相关命令
    • 查看整个日志:sudo journalctl
    • 查看 mytimer.timer 日志:sudo journalctl -u mytimer.timer
    • 查看 mytimer.timer 和 mytimer.service 日志:sudo journalctl -u mytimer
    • 从结尾开始查看最新日志:sudo journalctl -f
    • 从结尾开始查看 mytimer.timer 日志:journalctl -f -u timer.timer