服务器上使用crontab部署这两个每分钟自动执行的命令。首先,这两个命令是之前的人部署的,在我接手之前,就一直在了的。根据命令,实际上应该是做到每分钟都执行一次脚本。但是实际操作中,却发现,其实并没有严格的按照每分钟一次执行,有时候是两三分钟才会执行一次。因为这个延迟并不是特别影响实际应用,所以我一直没有很重视这个问题。

昨天因为需求,在服务器上又部署了一套服务,定时任务加到了三条。因为服务是相似的,所以我没有多想的直接复制了上一条定时任务的命令,只是修改了一下文件路径。然后晚上就发生了定时任务执行失败的问题。也不是一直失败,就是从每分钟一次,变成了十几分钟一次。非常的影响效率。

对此我很疑惑,为什么我只是加了一个命令,定时任务的执行时间就不对了。我开始上网找原因,我看过了大家各种各样的crontab踩坑记录,但是没有一条是符合我的情况的。知道我发现了这篇 https://blog.csdn.net/qivan/article/details/53836426 。虽然对方记录了四种常见的,能解决大部分情况的踩坑记录,但是和我的情况还是不符。那么我为什么会专门提起这篇呢,因为我发现,虽然对方记录的解决方法并不能帮助到我,但是文章中提到的第四种情况,加文件锁的方法,给了我启发。

使用linux flock 文件锁,可以避免任务的重复执行,所以一般情况是,针对执行频率快的命令,推荐加上锁。通过对文件锁命令的了解,我发现了我问题所在。

flock命令详解如下:

-s, --shared: 获得一个共享锁
-x, --exclusive: 获得一个独占锁
-u, --unlock: 移除一个锁,通常是不需要的,脚本执行完会自动丢弃锁
-n, --nonblock: 如果没有立即获得锁,直接失败而不是等待
-w, --timeout: 如果没有立即获得锁,等待指定时间
-o, --close: 在运行命令前关闭文件的描述符号。用于如果命令产生子进程时会不受锁的管控
-c, --command: 在shell中运行一个单独的命令
-h, --help 显示帮助
-V, --version: 显示版本

查看一下我的文件锁命令  flock -xn /tmp/yuxiu.lock -c      我用上了xn这两个命令,但看这个命令,其实是个很平常的命令,没有任何问题。但是我三个定时任务,用的都是这个命令。三个命令使用同一个独占锁,且没有立即获得锁,任务即算失败。所以一分钟之内,三个命令只会有一个命令是成功执行的,剩下两个就会失败。之前只有两个命令同时抢一个独占锁,所以有时候会有三四分钟的延迟。现在是三个命令抢一个锁。。这个等待时间就延长了。

所以解决办法也很简单,把其中两个任务的锁名改一下就好,每个命令有一个单独的文件锁。或者修改一下命令,把锁属性从独占锁变为共享锁。都可以解决这个问题。

通过这件事,不止学习了解到了flock命令,还需要记住一点,就是不能放过任何一个小细节。

crontab自动执行任务,失败原因记录的更多相关文章

  1. crontab 自动执行脚本

    crontab -e ================>自动执行某脚本!!!!!!! 1001 ls 1002 cd /home/wwwroot/default/ 1003 ls 1004 cr ...

  2. 如何在win10下使用Ubuntu中的crontab自动执行任务

    win10下如何下载ubuntu 1.打开Microsoft Store,搜索ubuntu,选择其一(我选了第一个),点击获取,耐心等待安装即可:   2.安装完成可在开始栏找到:   使用cront ...

  3. UNIX crontab自动执行脚本

    crontab 是不会加载环境变量的你手动执行可以是因为登录了oracle用户加载了环境变量,你可以在脚本里添加,echo $ORACLE_HOME  echo $ORACLE_SID 等等试试,看看 ...

  4. ubi 文件系统加载失败原因记录

    尝试升级 kernel 到 4.4.12版本,然后出现 kernel 加载 ubi 文件系统失败的现象,现象如下 [ 3.152220] ubi0 error: vtbl_check: too lar ...

  5. 手动执行脚本可以运行,crontab自动执行无效的解决方法

    在需要执行的脚本里加入环境变量即可,如下图:

  6. ubuntu cron 及 crontab 自动执行任务

    Add the below line (with tweaks) to the end of /etc/crontab: 30 23 * * * root shutdown -h now At 23: ...

  7. crontab定时执行shell脚本失败的原因

    有一段时间不用crontab定时执行任务了,这次趁着项目实施的机会来进一步分析一下crontab定时任务设置时遇到的一些棘手的问题. crontab -l 查看目前已经设置的crontab信息 cro ...

  8. Crontab无法自动执行,直接运行脚本却能执行

    Crontab无法自动执行,直接运行脚本却能执行 http://bbs.chinaunix.net/thread-1926428-1-1.html crontab -e crontab内容为* * * ...

  9. Linux中的定时自动执行功能(at,crontab)

    Linux中的定时自动执行功能(at,crontab) 概念 在Linux系统中,提供了两种提前对工作进行安排的方式 at 只执行一次 crontab 周期性重复执行 通过对这两个工具的应用可以让我们 ...

随机推荐

  1. 问题 B: 傻鸡抓大闸蟹

    问题 B: 傻鸡抓大闸蟹 时间限制: 1 Sec  内存限制: 128 MB提交: 94  解决: 39[提交] [状态] [命题人:jsu_admin] 题目描述 背景又到了吃大闸蟹的季节,黄老师想 ...

  2. AppDomain (转)

    AppDomain是CLR的运行单元,它可以加载Assembly.创建对象以及执行程序.AppDomain是CLR实现代码隔离的基本机制. 每一个AppDomain可以单独运行.停止:每个AppDom ...

  3. Cannot change column 'id': used in a foreign key constraint

    原因:为表添加自增长,但由于该表有外键而报错 发现是因为外键的影响,不能随便的更改表结构. 要想更改表结构,首先要把基层的表修改了. A表 作为B表的外键,A表不能随便修改. B表 有A表的外键,必须 ...

  4. CtfStudying之SSH私钥泄露

    8/23/19 SSH私钥泄露 对于只是给定一个对应ip地址的靶场机器,我们需要对其进行扫描,探测其开放服务.我原来理解的渗透就是找到目标的漏洞,然后利用这些(这种)漏洞,最后拿到机器的最高权限:其实 ...

  5. Sql 使用游标

    DECLARE data_cursor CURSOR FOR WITH T0 AS ( SELECT COUNT(f.DeptID) SubmitCount , f.DeptID FROM biz.F ...

  6. [POI2008]BLO(Tarjan)

    [POI2008]BLO Description Byteotia城市有\(n\)个 towns \(m\)条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所 ...

  7. 12 | 为什么我的MySQL会“抖”一下? 学习记录

    <MySQL实战45讲>12 | 为什么我的MySQL会“抖”一下? 学习记录 http://naotu.baidu.com/file/15aa54cab2fa882c6a2a1dd52e ...

  8. AOP技术介绍--(.Net平台AOP技术研究)

    4.1.Net平台AOP技术概览 .Net平台与Java平台相比,由于它至今在服务端仍不具备与unix系统的兼容性,也不具备类似于Java平台下J2EE这样的企业级容器,使得.Net平台在大型的企业级 ...

  9. 三、MyBatis-全局配置文件

    XML 映射配置文件(官方结构) MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置(settings)和属性(properties)信息.文档的顶层结构如下: configura ...

  10. 使用JavaBean对象存储表格数据

    范例:表格内容接上篇 package cn.sxt.collection; import java.util.ArrayList;import java.util.Date;import java.u ...