热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

让Crontab每秒钟执行一次任务的方法-linux运维

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

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每秒钟执行一次任务的方法的详细内容,更多请关注 第一PHP社区 其它相关文章!


推荐阅读
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文详细介绍了Linux系统中init进程的作用及其启动过程,解释了运行级别的概念,并提供了调整服务启动顺序的具体步骤和实例。通过了解这些内容,用户可以更好地管理系统的启动流程和服务配置。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • 在Python开发过程中,随着项目数量的增加,不同项目依赖于不同版本的库,容易引发依赖冲突。为了避免这些问题,并保持开发环境的整洁,可以使用Virtualenv和Virtualenvwrapper来创建和管理多个隔离的Python虚拟环境。 ... [详细]
  • PostgreSQL 10 离线安装指南
    本文详细介绍了如何在无法联网的服务器上进行 PostgreSQL 10 的离线安装,并涵盖了从下载安装包到配置远程访问的完整步骤。 ... [详细]
  • 本文详细介绍了如何在云服务器上配置Nginx、Tomcat、JDK和MySQL。涵盖从下载、安装到配置的完整步骤,帮助读者快速搭建Java Web开发环境。 ... [详细]
  • 本文详细介绍了 Linux 系统中用户、组和文件权限的设置方法,包括基本权限(读、写、执行)、特殊权限(SUID、SGID、Sticky Bit)以及相关配置文件的使用。 ... [详细]
author-avatar
Smile--麦芽
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有