服务器上使用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. java 中断线程的几种方式 interrupt()

    中断 中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作.线程是死亡.还是等待新的任务或是继续运行至下一步,就取决于这个程序.虽然初次看来它可能显 ...

  2. P3724 [AH2017/HNOI2017]大佬

    传送门 发现保持自信和做其他事情互不干扰,可以直接做一次 $dp$ 求出最多能空出几天来怼大佬 然后就变成给你若干天,是否能怼死大佬,考虑求出所有的 天数和输出的嘲讽值集合,因为天数不多,嘲讽值增长很 ...

  3. H5白屏问题

    前言 前阵子弄了灰度环境,H5这边需要给灰度环境的接口加上Cookie,配置的期间遇到一些Cookie问题以及白屏在此记录下 1.H5请求接口带不上Cookie 解决方法:前端使用了 webpack ...

  4. jQuery学习总结02-筛选

    一.筛选 1.eq(index|-index) 说明:获取当前链式操作中第N个jQuery对象,返回jQuery对象,类似的有get(index),不过get(index)返回的是DOM对象 示例: ...

  5. python-验证功能的装饰器示例

    user_list=[ {'}, {'}, {'} ] current_dict={'username':None,'login':False} def auth(auth_type): def au ...

  6. break语句、continue语句、goto语句的用法辨析

    1.break语句 break语句常使用在switch语句.循环体以及if语句中,它的作用是跳出循环,而且只能跳出一层循环. for (i = 0; i < 10; ++j) { for (j ...

  7. bzoj2402 陶陶的难题II 分数规划+树剖+线段树维护凸壳+二分

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2402 题解 看上去很像分数规划的模型.于是就二分吧.令 \[ \begin{align*}\f ...

  8. Python语言为什么被称为高级程序设计语言?

    Python是一种令人惊叹的编程语言,毫无疑问.从1991年的卑微开始,它现在几乎无处不在.无论您是在进行Web开发,系统管理,测试自动化,devop还是数据科学,Python在您的工作中发挥作用的可 ...

  9. MATLAB 和 armadillo 数据转换

    #include<iostream> #include<armadillo> int D=5; int M=4; int main() { arma::fmat x; x.ra ...

  10. 【HbuilerX-Bug】终端无法显示打印信息,也无法输入

    经过调试HbuilderX“终端”插件,最终定位问题,问题是插件在打开终端时,无法定位具体的窗口程序,如“cmd.exe”.“powershell.exe”等.可能产生原因:1.可能是电脑系统升级产生 ...