百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>服务器> 让Crontab每秒钟施行一次任务的办法
分享文章到:

让Crontab每秒钟施行一次任务的办法

发布时间:09/01 来源:未知 浏览: 关键词:

Crontab是linux下按时调度配置文件,通过它,我们可以让系统的程序、足本、命令、任务按设定的时间、间隔、周期轮回的运转。 在Crontab里时间粒度最小的是分钟。也就是说,通过Crontab配置,我们最多可以让目标任务每分钟施行一次,更频繁的施行是不可的,只能借助其它办法。

相关学习引荐:linux视频教程

比方说,假如但愿一个程序每30秒施行一次,该如何办呢?

变通的办法还是有的。 一种思绪是,在Crontab里增加两条配置,一条是正常调度,每分钟施行一次,另一条是等候30秒后才施行。

# Need these to run on 30-sec boundaries, keep commands in sync.
* * * * *              /path/to/executable param1 param2
* * * * * ( sleep 30 ; /path/to/executable param1 param2 )

这种办法感受有点生硬,怪怪的,但确实可行。这种办法实际是可以简写成一行:

* * * * * /bin/bash -l -c "/path/to/executable; sleep 30 ; /path/to/executable"

还有一种办法是使用watch命令:

$ watch --interval .30 script_to_run_every_30_sec.sh

但watch是命令行工具,我们可以使用nohup命令让它在后台运转。

SystemD按时器

假如我们使用的linux系统里有SystemD,可以使用SystemD按时器在任何时间粒度上调度程序,理论上可以小到纳秒级别——当然,这样做有点疯狂。总之,它在任务调度上的灵敏性远比Cron要高——无需使用sleep这种蹩足的方案。

比起一行完成配置的crontab来说,创立一个SystemD按时器会显得轻微复杂一些,但为了更好的实现小于‘每分钟’粒度的调度任务,这种办法值得尝试。

SystemD按时器实现道理简便说就是两部分:一个系统service,一个SystemD按时器。SystemD按时器施行调度,而任务是写在service里。

下面有个简便的例子,目标是让系统logger每十秒钟输出一次“Hello World”;

/etc/systemd/system/helloworld.service

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

/etc/systemd/system/helloworld.timer

[Unit]
Description=Say Hello every 10 seconds
[Timer]
OnBootSec=10
OnUnitActiveSec=10
AccuracySec=1ms
[Install]
WantedBy=timers.targethelloworld.timer里并没有声明service的名称,那它和service是怎样关联的呢?没错,由于它们的名称雷同,都是helloworld。

假如想让整个系统使用这个按时器,这两个文件就需要放置在/etc/systemd/system下。假如想给某个会员使用,则放置在~/.config/systemd/user。想让这个按时器马上运转,需要施行下面的命令:

systemctl enable --now helloworld.timer

里面的–now标志是让按时器马上施行。不然,只要等系统重新启动后,或者会员登录是才会触发运转。

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

  • OnBootSec – 系统启动多少秒后开端施行调度
  • OnUnitActiveSec – 反复调度相关service的时间间隔。就是这行配置决议了跟cron job一样按时调度的动作。
  • AccuracySec – 按时器精度。 默许是一分钟,跟cron很类似。可以要求的更高,但精度增添会带来更多系统的耗损,更频繁的叫醒CPU。上面的配置里写的是1ms,明显不是个聪慧的决议。平常我们可以把它设定为 1(1秒),关于我们这样低于1分钟时间粒度的按时器的精度要求已经够用了。也是由于如此,我们会看到,实际程序运转时输出“Hello World”新闻的时间经常会延迟1秒摆布。假如你认为这一秒摆布的延迟不是问题,那就应当这样设定。

你会发明,SystemD按时器和Crontab按时器并不是一样的——任务调度的周期并不是按年月日小时分钟周期设定的,它是按我们第一次施行它的时间开端,每次追加一个周期的时间。假如我们钟情于Crontab那样的时间配置方式,SystemD按时器也是支撑的,那就需要把OnBootSecOnUnitActiveSec去除,换成OnCalendar,下面是一个例子:

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

最后补充一点,默许状况下,SystemD按时器和service的关联是通过雷同的名称,假如你情愿,也可以在[Timer]配置里通过指定Unit字段配对。

上面的几种办法都可以实现低于分钟粒度的按时调度任务。各有长处。SystemD按时器看起来更正规,但轻微复杂了一点。Crontab+sleep方式虽然别扭,但关于一些小任务来说没有不克不及胜任的。

以上就是让Crontab每秒钟施行一次任务的办法的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有151人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板