让Crontab每秒钟执行一次任务的方法


当前第2页 返回上一页

/etc/systemd/system/helloworld.service

1

2

3

4

[Unit]

Description=Say Hello

[Service]

ExecStart=/usr/bin/logger -i Hello World

/etc/systemd/system/helloworld.timer

1

2

3

4

5

6

7

8

[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。想让这个定时器立即运行,需要执行下面的命令:

1

systemctl enable --now helloworld.timer

里面的?Cnow标记是让定时器立即执行。否则,只有等系统重启后,或者用户登录是才会触发运行。

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

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

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

1

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

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

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

以上就是让Crontab每秒钟执行一次任务的方法的详细内容,更多文章请关注木庄网络博客

返回前面的内容

相关阅读 >>

如何释放一台按量付费实例或者到期的预付费的实例

Linux下执行php命令提示错误

Linux下vsftpd的安装及配置介绍

Linux怎么查看当前用户

Linux怎么开启php

Linux终端类型的详解

如何所有可能的实例状态中批量获取实例状态信息

Linux 在添加账号后无权限如何解决?

Linux查看多少位系统

Linux系统下安装rz/sz命令教程以及用法说明

更多相关阅读请进入《Linux》频道 >>



打赏

取消

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

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

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

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...