首页 > linux的 计划任务机制,自己带节奏

linux的 计划任务机制,自己带节奏

文章目录

        • 1. 解决问题
        • 2. 计划任务分类
        • 3. 一次性计划任务实现
          • 添加计划步骤
          • 注意事项
        • 4. 周期性计划任务实现
          • `cron`和`crontab`命令
        • 5. 延时计划任务
        • 6. `flock`脚本加锁,保证单实例运行

1. 解决问题

环境中有脚本需求,周期性运行或者固定时间运行脚本,为了保证脚本的正常运行以及不会有冲突,可以增加计划任务来保证脚本在指定时间,正常顺利运行。

2. 计划任务分类

  • 一次性计划任务
  • 周期性计划任务
  • 为脚本加锁

3. 一次性计划任务实现

添加计划步骤

核心命令at,可以通过man at查看具体详细用法

运行方式如下:

[root@node1 design_partten]$ date #获取系统时间
Fri Apr 17 17:13:21 CST 2020
[root@node1 design_partten]$ at 17:15 #在17:35 分执行如下命令
at> echo hello >/tmp/hello.txt
at> <EOT>                             #按 ctrl+d 提交计划
job 3 at Fri Apr 17 17:15:00 2020
[root@node1 design_partten]$ atq      #查看系统已有计划列表
3	Fri Apr 17 17:15:00 2020 a root
...[root@node1 design_partten]$ date
Fri Apr 17 17:15:08 CST 2020
[root@node1 design_partten]$ cat /tmp/hello.txt    #查看文件内容
hello
[root@node1 design_partten]$ ls -l /tmp/hello.txt  #查看文件创建时间
-rw-r--r-- 1 root root 6 Apr 17 17:15 /tmp/hello.txt

以上过程同样适用于脚本的执行,在指定时间执行脚本。

注意事项
  1. 计划中的命令 有可能不在$PATH路径变量中,添加计划时最好加入绝对路径

  2. 计划任务at没有终端,不支持标准输出,所以计划任务的输出结果需要重定向到文件才能查看。

    at> echo hello >/tmp/hello.txt

4. 周期性计划任务实现

croncrontab命令
  • 配置方式 crontab -e ,最小运行单位为分钟

  • 查看现有的计划任务crontab -l

  • 配置格式

    分钟 小时 日期 月份 星期 执行的命令

    注意命令的路径问题($PATH)

具体配置步骤如下:

$crontab -e 
#输入如下命令,表示任意时间就执行一次date命令,并将结果重定向到/tmp/data.txt
* * * * * /usr/bin/date >> /tmp/data.txt#通过tail -f /var/log/cron 查看针对crontab 的编辑操作
$tail -f /var/log/cron
Apr 17 17:39:04 node1 crontab[67309]: (root) REPLACE (root)
Apr 17 17:39:04 node1 crontab[67309]: (root) END EDIT (root)
Apr 17 17:39:23 node1 crontab[86411]: (root) BEGIN EDIT (root)
Apr 17 17:39:45 node1 crontab[86411]: (root) REPLACE (root)
Apr 17 17:39:45 node1 crontab[86411]: (root) END EDIT (root)
Apr 17 17:40:01 node1 CROND[96072]: (root) CMD (/usr/bin/date >> /tmp/data.txt)#查看执行结果
$cat /tmp/data.txt 
Fri Apr 17 17:40:01 CST 2020
Fri Apr 17 17:41:01 CST 2020
Fri Apr 17 17:42:01 CST 2020
Fri Apr 17 17:43:01 CST 2020$crontab -e
#周一到周五 ,每隔1分钟运行一次,不管月份和星期,则运行一次命令
* * * * 1-5 /usr/bin/date >> /tmp/data.txt
#7月7日,且这一天是周一到周五,则运行一次命令
* * 7 7 1-5 /usr/bin/date >> /tmp/data.txt
#每月15号 3.00整执行该命令
0 3 15 * * * /usr/bin/date >> /tmp/data.txt

5. 延时计划任务

当出现异常的时候:计划任务执行前2分钟操作系统关机,周期性计划任务就没办法执行。

此时推出延时计划任务:anacontab

编辑/etc/cron.d/0hourly查看内容如下:

# Run the hourly jobs,每小时的第一分钟运行一次
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
#通过run-parts脚本,调用/etc/cron.hourly ,并在一个位置增加一个标记表示当前这一小时已经运行了。如果没有运行,则可以运行。
01 * * * * root run-parts /etc/cron.hourly 

编辑/etc/anacrontab

# /etc/anacrontab: configuration file for anacron# See anacron(8) and anacrontab(5) for details.SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
# 随机的延时,数字0-45之间,选取任意一个数字用做延时的时间
RANDOM_DELAY=45 
# the jobs will be started during the following hours only
# 延时计划任务启动时间,数字在3-22点之间任选一个 数字运行
START_HOURS_RANGE=3-22#period in days   delay in minutes   job-identifier   command
#优先级是1,表示每天都运行,5表示延时时间。则运行时间范围是3:05-3:55(加入取的延时计划启动时间选取的是3点)
1	5	cron.daily		nice run-parts /etc/cron.daily #每天运行的任务
7	25	cron.weekly		nice run-parts /etc/cron.weekly #每周运行的任务
@monthly 45	cron.monthly		nice run-parts /etc/cron.monthly #每月运行的任务

6. flock脚本加锁,保证单实例运行

案例a.sh

#!/bin/bashsleep 3600

为了保证以上a.sh同一时间只运行一个,则可以使用flock增加排他锁

flock -xn "/tmp/f.lock" -c "/root/a.sh"
...

以上命令在第二个终端运行的时候则无法正常运行

flock -xn "/tmp/f.lock" -c "/root/a.sh"

更多相关:

  • 昨天去面了滴滴,一口气面了三面,考了 promise 和事件循环。之前的猿辅导也考察了这些,几乎所有的大厂中厂都一定会考原生 js 的事件循环队列。今天,我把昨天考察的原题拿出来分析一下。setTimeout浏览器是多线程的,js 是单线程的(因为多线程操作同一个 dom 会有数据不一致的问题),但 js 又支持异步,因此异步就是在...

  • 检查是否安装redis(没有请自行百度安装): phpinfo: 配置thinkphp-queue,没有请执行 composer require topthink/think-queue 加入: 创建 队列 文件: use thinkQueue;class TestQueue {// 测试public function que...

  • 要实现计划任务,首先通过在配置类注解@EnableScheduling来开启对计划任务的支持, 然后在要执行计划任务的方法上注解@Scheduled,声明这是一个计划任务 示例:计划任务执行类 在这个类中的方法上需要@Scheduled注解配合@EnableScheduling使用。 package cn.hncu.p3.p3_ta...

  • cron:计划任务,是任务在约定的时间执行已经计划好的工作,根据配置文件约定的时间来执行特定的任务。 编写测试类继承 IJob ,实现Execute 此方法就是用于定时的任务 配置定时时间: 先创建windows服务,服务创建详情 InstallUitil创建服务 服务创建成功后开起服务即可进行定时任务的执行 定时任务执行结果:...

  • 站立会议:       继续数据库的连接编程。 任务进度:       实现数据的输出。 站立会议照片: 任务看板: 燃尽图: 转载于:https://www.cnblogs.com/cpljlgs/p/5546157.html...

  • 说明如下: (1)所有操作最好使用root操作,以尽可能避免权限问题 (2)crtmpserver和web服务器apache(Ngnix亦可)被装在同一台服务器上,客户端使用其他PC的桌面浏览器和android手机,下面是测试环境示意图: (3)测试环境位于局域网内,由一台路由器接入联通运营商提供的10M包年网络服务 (...

  • 1. free 2. top 3. vmstat 4. slabtop; 5. pmap 6. dmesg 7. /proc/meminfo 8. /proc/sys/vm 目录下的文件 9. sync 10./proc/zoneinfo  11./proc/pagetypeinfo 查看内存工具:1.free free - Dis...

  • 文章目录前言创建二叉树先序遍历中序遍历后序遍历获取叶子节点个数获取树的高度测试代码 前言 现有如下二叉树: 关于二叉树的相关操作,我们能够发现二叉树从根节点到子节点,以及每个中间节点基本都能够拆分为若干个子节点的操作,且每个子节点的操作都和其头节点操作一致。 所以我们针对二叉树的操作都可以使用分治算+回溯/归并算法进行...

  • 今天需要部署一个ceph L 版本12.2.12的环境,无奈最近公司网络无法访问到ceph官网,只能使用之前下载好的ceph-deploy-1.5.39版本,安装上之后一口老血喷了出来,没有mgr的部署选项。 无奈之下只能自己制作一个1.5.38版本的ceph-deploy包,借用从ceph-deploy-1.5.39-0.src....

  • root 权限进入MySQL: mysql –uroot 查看当前MySQL用户: select user,host from mysql.user;     此处以User为root,Host为localhost的账户为例,将密码改为password的命令:   SET PASSWORD FOR 'root'@'localhost...