分享

玩转 Linux cron

 首家i55ryzehof 2018-08-28

本篇文章介绍了Linux cron中可能会遇到的坑。

回顾上篇文章:浅谈 TCP 拥塞控制算法

* * 1,15 * Sun 什么时候会执行?

我们知道每个值分别是 Minutes,Hours,Day of month,Month,Day of week 每个值得范围如下。

逗号(,)月份和星期几缩写不区分大小写。

逗号用于分隔列表中的项目。例如,在第 5 个字段(星期几)中使用 “MON,WED,FRI” 表示星期一,星期三和星期五。

连字符( - )

连字符定义范围。例如,2000-2010 表示 2000 年至 2010 年间的每一年,包括在内

回到答案 :'* * 1,15 * Sun' will run on the first and fifteenth AND every Sunday 。这列相互独立。单独生效。看下代码实现:

跟你想的一样么?这个又会什么时候执行呢?

一个查看生效时间的网站https:///

命令中的百分号%

从 crond 大概的执行流程来看大概分为下面几个过程

如果命令中存在 % 则在 child_process() 会把 % 后面的值截断。在 execle 之后在 fork 一个进程把这些值作为标准输出传递给 execle

命令里面有多个 % 号会怎么样呢?答案是作为换号符使用

真是这样么 大家可以试一下

简单写法

@reboot 个人用户可以保证自己的程序在服务器重启后启动。因为不是谁都可以修改 init 文件。(还好我们有 god 基本上不会用这种方式)

邮件的问题

在近期服务排查中发现大量服务器根分区 Inodes 超过 90% cpu 使用率有上升。通过排查发现如下进程

通过 pstree 发现,其父进程为 crond 。

为什么 crond 会产生这个进程呢?

从 crond 调度过程说起:

crond 会 fork 一个子进程去执行任务,而该进程有会再 fork 一个孙子进程执行真正的命令,代码的调用逻辑如下。

在 child_process() 函数中通过 fork() 子进程前,会创建两个管道 (stdin+stdout) 用来与子进程通讯,分别表示输入和输出。默认情况下,crontab 会将命令执行的输出,通过邮件发送给用户

而公司装机模板中 postfix 并没有正常启动(权限问题)导致大量未发送文件到 /var/spool/postfix/maildrop。(当时处理过程c3 c4 服务器 postfix 未启动导致 cron 服务占用大量 Inodes)

如果避免这种情况呢:

1 . 配置运行脚本输出为 >/dev/null 2>&1,来避免 crontab 运行中有内容输出。

2. 修改 crond 启动脚本 增加 - m off 选项

正确的逻辑

在海外容器集群中发现部分实例发生 oom,经过排查大量进程导致内存耗尽。

/home/work/nginx/scripts/nginx_perf.py

上报脚本使用 crond 来实现调度上报。

这个问题告诉我们在使用 crond 尤其是分钟级别的监控时不能忽略两个问题:

1. 一个 crond 程序要有锁机制避免程序没有退出时,另一个进程开始执行的逻辑错误或者资源释放问题。

2. 有锁机制的同时要有超时机制避免程序异常没有释放锁导致后续任务无法执行问题。

邪恶的 Davlight Savings time

没听说过夏令时?少年你还是太年轻。维基地址https://zh./zh / 夏时制突然多一个小时少一个小时 cron 怎么处理呢?

看下手册吧(Paul Vixie 版本)

Daylight Saving Time and other time changes Local time changes of less than three hours, such as those caused by the start or end of Daylight Saving Time, are handled specially. This only applies to jobs that run at a specific time and jobs that are run with a granularity greater than one hour. Jobs that run more frequently are scheduled normally.

If time has moved forward, those jobs that would have run in the interval that has been skipped will be run immediately. Conversely, if time has moved backward, care is taken to avoid running jobs twice. Time changes of more than 3 hours are considered to be corrections to the clock or timezone, and the new time is used immediately.

例如:

被安排到不存在时间(例如,安排在法国春季时间2:30执行的任务,而时钟在凌晨2:00之后会直接跳到凌晨3:00)的命令会在时间改变后马上执行(大概在夏令时3:00)(如果有很多任务服务器会不不会挂掉)。另一方面,在秋天,需要多次执行的命令(夏令时凌晨2:30,标准时间凌晨2:30之后一个小时,由于凌晨在3:00,时钟被回调至凌晨2:00)只会执行一次。

要当心了,如果不同任务的调度顺序和延迟相互关联,就需要检查使用时,是否兼容一致;如果有必要,为每年可能发生问题的夜晚准备专门的调度程序。

The last

面对线上服务要心存敬畏之心。

参考附录

https://zh./wiki/Cron

https://access./solutions/477963

源码地址

http://ftp./debian/pool/main/c/cron/cron_3.0pl1.orig.tar.gz

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多