沙滩星空的博客沙滩星空的博客

Linux下代替crontab的定时器systemd.timer

Systemd 单元

单元就是 Systemd 的最小功能单位,一个个小的单元互相调用和依赖,组成一个庞大的任务管理系统.大概一共有12种.
每个单元都有一个单元描述文件,它们分散在三个目录。

  • /lib/systemd/system:系统默认的单元文件
  • /etc/systemd/system:用户安装的软件的单元文件
  • /usr/lib/systemd/system:用户自己定义的单元文件

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

单元的管理命令

# 启动单元
$ systemctl start [UnitName]

# 关闭单元
$ systemctl stop [UnitName]

# 重启单元
$ systemctl restart [UnitName]

# 杀死单元进程
$ systemctl kill [UnitName]

# 查看单元状态
$ systemctl status [UnitName]

# 开机自动执行该单元
$ systemctl enable [UnitName]

# 关闭开机自动执行
$ systemctl disable [UnitName]

Service 单元

Service 单元就是所要执行的任务。
新建 Service ,就是在 /usr/lib/systemd/system 目录里 新文件,如 mytimer.service :

    [Unit]
    Description=MyTimer
    
    [Service]
    ExecStart=/bin/bash /path/to/mail.sh
[Unit]
Description=My Service
After=network.target

[Service]
Type=simple
WorkingDirectory=/home/mcmanage
ExecStart=sudo /path/to/my/command
# 只要不是通过systemctl stop来停止服务,任何情况下都必须要重启服务,默认值为no
Restart=always
# 意外关闭后,5秒后自动重启
RestartSec=5
User=root

[Install]
WantedBy=multi-user.target

[Unit]部分介绍本单元的基本信息(即元数据),Description字段给出这个单元的简单介绍(名字叫做MyTimer)。
[Service]部分用来定制行为,Systemd 提供许多字段。定义的时候,所有路径都要写成绝对路径

  • ExecStart:systemctl start所要执行的命令
  • ExecStop:systemctl stop所要执行的命令
  • ExecReload:systemctl reload所要执行的命令
  • ExecStartPre:ExecStart之前自动执行的命令
  • ExecStartPost:ExecStart之后自动执行的命令
  • ExecStopPost:ExecStop之后自动执行的命令

启动自定义服务:

sudo systemctl start mytimer.service

Timer 单元

Time单元 用于定时执行 Service单元

/usr/lib/systemd/system 目录,新建mytimer.timer:

[Unit]
Description=Runs mytimer every hour

[Timer]
OnUnitActiveSec=1h
Unit=mytimer.service

[Install]
WantedBy=multi-user.target
  • OnUnitActiveSec=1h 一小时执行一次任务
  • OnUnitActiveSec=--* 02:00:00 每天凌晨两点执行
  • OnUnitActiveSec=Mon --* 02:00:00 每周一凌晨两点执行

[Unit]:定义元数据。

[Timer]:定制定时器。Systemd 提供以下一些字段。

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

[Install]:定义开机自启动(systemctl enable)和关闭开机自启动(systemctl disable)这个单元时,执行的命令。

WantedBy=multi-user.target :执行 systemctl enable mytimer.timer 时,mytimer.timer 归属于 multi-user.target。系统会在 multi-user.target.wants 目录里创建 mytimer.timer 的符号链接。

multi-user.target :多用户模式。

启动某个 Target 时,属于这个 Target 的所有进程都会全部启动。

定时器的相关命令

sudo systemctl start mytimer.timer
systemctl status mytimer.timer
# 查看所有正在运行的定时器。
systemctl list-timers
sudo systemctl stop myscript.timer
sudo systemctl enable myscript.timer
sudo systemctl disable myscript.timer

日志相关命令

# 查看整个日志
$ 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

systemctl添加自定义服务 https://www.cnblogs.com/rainbow-tan/p/16448004.html
Systemd 定时器教程 https://www.cnblogs.com/chengkanghua/p/12708584.html
Systemd基础:5:定时器Timer的实现示例 https://blog.csdn.net/liumiaocn/article/details/89093229

未经允许不得转载:沙滩星空的博客 » Linux下代替crontab的定时器systemd.timer

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址