zoukankan      html  css  js  c++  java
  • crontab、watch、systemd timer定时任务

    1、crontab定时任务

    默认最小单位分钟级别,如果要实现秒级通常需要shell sleep等进行辅助控制实现。

    例如:每30s执行一次

    # 1. 多条crontab 每分钟一次,另一条sleep 30s后执行
    # Need these to run on 30-sec boundaries, keep commands in sync.
    * * * * *              /path/to/executable param1 param2
    * * * * * ( sleep 30 ; /path/to/executable param1 param2 )
    
    #2.单条crontab
    * * * * * /bin/bash -l -c "/path/to/executable; sleep 30 ; /path/to/executable"

    2、watch定时任务

    # 前台执行
    # watch
    --interval .30 script_to_run_every_30_sec.sh # nohup后台执行 每秒一次输出系统的平均负载到文件
    # nohup watch -n 1 'cat /proc/loadavg >> 1.txt' &

    3、systemd timer定时任务

    systemd timer可以在任何时间粒度上调度程序,理论上可以小到纳秒级别。任务调度上的灵活性远比crontab高,并且不需使用sleep这种蹩脚的方案。systemd定时任务的实现需要两个配置,一个是service,一个是timer。其中service用来定义任务内容,timer用来定义执行周期。下面有个简单的例子,目标是让系统logger每十秒钟输出一次“Hello World”

    vim /etc/systemd/system/helloworld.service

    [Unit]
    Description=Say Hello
    [Service] ExecStart
    =/usr/bin/logger -i Hello World

    vim /etc/systemd/system/helloworld.timer

    [Unit]
    Description=Say Hello every 10 seconds
    
    [Timer] OnBootSec
    =10 OnUnitActiveSec=10 AccuracySec=1ms
    [Install] WantedBy
    =timers.target

    helloworld.timer里并没有声明service的名称,那它和service是如何关联的呢?默认情况下systemd定时器和service的关联是通过相同的名称,如果名称不同则可以在[Timer]配置里通过指定Unit字段来指定。如果想让整个系统使用这个定时器,这两个文件就需要放置在/etc/systemd/system下。如果想给某个用户使用,则放置在~/.config/systemd/user。

    如果想让这个定时器立即运行,则可以使用--now参数进行enable,否则,只有等系统重启后,或者用户登录是才会触发运行。

    systemctl enable --now helloworld.timer

    [Timer]部分里的各个字段的作用如下:

    OnBootSec – 系统启动多少秒后开始执行调度

    OnUnitActiveSec – 重复调度相关service的时间间隔。就是这行配置决定了跟cron job一样定时调度的动作。

    AccuracySec – 定时器精度。 默认是一分钟,跟cron很相似。可以要求的更高,但精度增加会带来更多系统的消耗,更频繁的唤醒CPU。上面的配置里写的是1ms,显然不是个聪明的决定。通常我们可以把它设置为 1(1秒),对于我们这样低于1分钟时间粒度的定时器的精度要求已经够用了。也是因为如此,我们会看到,实际程序运行时输出“Hello World”消息的时间经常会延迟1秒左右。如果你认为这一秒左右的延迟不是问题,那就应该这样设定。

    systemd timer可以分为相对时间周期和日历时间周期。相对执行周期的参考时间为第一次执行的时间,之后按照周期执行。日志时间周期执行则需要通过OnCalendar来设定。

    例如:

    OnCalendar=*-*-* *:*:00,10,20,30,40,50

    Copyright © 2021 Primzahl. All rights reserved.

  • 相关阅读:
    Spring mvc时间格式处理
    dubbo升级spring4与cxf
    dom4j使用总结
    java utils
    ES6
    ES6
    javascript常用方法
    ES6
    ES6
    ES6
  • 原文地址:https://www.cnblogs.com/Primzahl/p/13548003.html
Copyright © 2011-2022 走看看