Cron运行原理

原创 2018年04月17日 09:14:11

目录

目录 1

1. 前言 1

2. 示例 1

3. 工作过程 2

4. 一个诡异的问题 3

5. cron&crontab 3

6. cron.allow&cron.deny 3

7. cron.daily&cron.hourly&cron.weekly&cron.monthly 3

8. crontab编辑后cron异常 4

 

1. 前言

本文介绍的是由Paul Vixie开发的运行在SuSE Linux上的Cron。可以通过“man cron”进行确认。

2. 示例

示例用来配合本文的说明

*/1 * * * * echo hello >> /tmp/hello.txt

3. 工作过程

 

Cron每分钟做一次检查,看看哪个命令可执行。

从上图可以看到,有4fork,这4fork分别是:

1) 第一个fork,让Cron自己成为Daemon进程,即成为守护进程;

2) 第二个fork,当Cron检查到有命令需要执行时被创建,但注意它并不执行命令,执行命令由它的子进程来做;

3) 第三个fork,有些版本调用的是vfork,但有些版本却是fork,它是负责执行Cron命令的进程,即会调用execle()的进程;

4) 第四个fork不是必须的,只有为Cron命令配置了标准输入才会用:

*/1 * * * * /tmp/X/x%1234567890

 

像上面有个百分符“%”,后面跟一串,则会有第四个fork,它的作用是将“%”后面的内容作为标准输入传递给第三个fork出来的进程。

 

注意fork出来的进程没有忽略(ignore)管道信号(SIGPIPE),所以如果遇到SIGPIPE,则会导致进程无声无息的退出,比如标准输主输出重定向管道的读端被关闭了,写时就会触发SIGPIPE。

 

实践中,可能会遇到child_process()在做上述所说的第三个fork前因SIGPIPE信号退出,导致难以理解的问题。其中一个现象是:Cron命令被执行了若干次,但之后再也不执行了,原因在于第二个fork出来的进程因SIGPIPE退出了,导致没有进行第三个fork,因此Cron命令没有被调用(总是由execle()调用)。

 

 

4. 一个诡异的问题

你有可能遇到这样的情况,假设在cron中有如下一条配置:

*/1 * * * * echo hello >> /tmp/hello.txt

 

观察到它正常运行几次后,就不再运行了,或者一次也不能,但确认无其它问题,因此十分诡异。

 

这个问题的原因,有可能是因为有共享库Hookcron,共享库代码触发了SIGPIPE,导致了第二个fork出的进程退出,没来得及执行vfork

 

fork出来的子进程,没有对SIGPIPE进行任何处理,默认行为是悄悄退出进程。通过修改/etc/ld.so.preload,可以将共享库注入到非关联的进程中,可通过ldd观察到这种依赖,使用LD_PRELOAD也可以达到同样的效果。

5. cron&crontab

cron是一个在后台运行的守护进程,而crontab是一个设置cron的工具。cron调度的是/etc/crontab文件。

6. cron.allow&cron.deny

crontab使用的两个文件,cron不会用到它们。

7. cron.daily&cron.hourly&cron.weekly&cron.monthly

cron.dailycron.hourlycron.weeklycron.monthly这四个目录均位于/etc下,但croncrontab两个并不处理。它们是由配置在/etc/crontab中的run-crons处理,run-crons是位于目录/usr/lib/cron下的一个Shell脚本文件:

# cat /etc/crontab

SHELL=/bin/sh

PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin

MAILTO=root

#

# check scripts in cron.hourly, cron.daily, cron.weekly, and cron.monthly

#

-*/15 * * * *   root  test -x /usr/lib/cron/run-crons && /usr/lib/cron/run-crons >/dev/null 2>&1

8. crontab编辑后cron异常

使用crontab编辑后,cron卡住不动(不是指进程卡住了,而是指命令没有被调用),原因可能是因为“tcb table full”,最简单的办法是重启cron

 

建议避免写下面这样的嵌套命令语句,它有可能导致cron不能正常工作:

*/1 * * * * echo "`date +%H:%M:%S` hello" >> /tmp/hello.txt

 

echo”中嵌套了“date”,可以改成脚本调用,或者不嵌套命令,如:

*/1 * * * * echo "hello" >> /tmp/hello.txt

 

一个现象是有一个cron子进程(如下述的14786)不退出了:

# ps -ef|grep cron

root     10325     1  0 15:08 ?        00:00:00 /usr/sbin/cron

root     14786 10325  0 15:13 ?        00:00:00 /usr/sbin/cron

 

gdb看到的调用栈为:

#0  0xffffe410 in __kernel_vsyscall ()

#1  0xb7e88a63 in __read_nocancel () from /lib/libc.so.6

#2  0xb7e38e38 in _IO_file_read_internal () from /lib/libc.so.6

#3  0xb7e3a0bb in _IO_new_file_underflow () from /lib/libc.so.6

#4  0xb7e3a7fb in _IO_default_uflow_internal () from /lib/libc.so.6

#5  0xb7e3bb2d in __uflow () from /lib/libc.so.6

#6  0xb7e35b7b in getc () from /lib/libc.so.6

#7  0x80005d73 in ?? () from /usr/sbin/cron

 

strace看到如下:

# strace -f -p 14786

Process 14786 attached

read(7

 

借助lsof可以看到:

cron    14786 root    7r  FIFO        0,6         117960708 pipe

 

为一个管道,read()挂住的原因可能是因为管道另一端所在进程调用_exit()退出而不是调用exit()退出。

 

这个时候只有人工kill这个挂起的cron子进程。


Crontab专题:http://blog.chinaunix.net/uid/20682147/cid-224920-list-1.html

详解Linux中cron/crontab工作原理

先介绍几个基本概念:       后台进程:在后台运行的无须与用户交互的程序。在多任务操作系统上运行多个后台进程,有些后台进程(例如守护程序)从来都不需要用户输入,其它一些进程只是在用户忙于目...
  • wzyzzu
  • wzyzzu
  • 2014-12-26 09:50:49
  • 1251

解决cron不能启动脚本的问题

解决cron不能启动脚本的问题 一、背景 在开发过程中总是会需要系统cron服务启动我们自定义的服务。我们手动运行脚本,脚本中定义的服务就能运行。如果我们让cron服务来管理我们的脚本,有可能...
  • xiangguiwang
  • xiangguiwang
  • 2015-11-24 00:31:37
  • 1034

openwrt 上cron的使用

1.首先在 /etc/crontabs 目录下创建一个名字为root 的文件 :touch root 2.编辑root文件,里面的内容格式如下: f1 f2 f3 f4 f5 program ...
  • u013267633
  • u013267633
  • 2016-07-20 14:46:39
  • 711

crontab的原理及使用

#!/bin/shCRONTAB_COMMAND="* * * * * /usr/local/watch/start_watch.sh"echo  "${CRONTAB_COMMAND}" >> /v...
  • jkh753
  • jkh753
  • 2011-01-19 11:10:00
  • 5842

Discuz! X2 计划任务原理分析

最近发现论坛内有些用户当月在线时间被清空,究其原因发现是清空当月在线时间的计划任务在某一错误时刻被执行。 就本帖分析下计划任务的实现过程,方便用户排查错误。 数据库结构: 论坛内...
  • fengda2870
  • fengda2870
  • 2014-10-29 12:00:39
  • 1388

Linux下利用Cron定时执行程序

cron基本知识 名词解释 cron是服务名称,crond是后台进程,crontab则是定制好的计划任务表。 配置文件目录: cd /etc/cron.d 日志文件目录: vim /var...
  • chichuduxing
  • chichuduxing
  • 2017-03-30 18:06:12
  • 885

linux怎样停止一个正在运行的crontob

cron 计划任务,是任务在约定的时间执行已经计划好的工作,这是表面的意思。在Linux中,我们经常用到 cron 服务器来完成这项工作。cron服务器可以根据配置文件约定的时间来执行特定的作务。比...
  • lijia111111
  • lijia111111
  • 2017-03-30 19:57:11
  • 343

关于CronTigger的设置周期性定时任务的Cron表达式

cron的表达式被用来配置CronTrigger实例。 cron的表达式是字符串,实际上是由七子表达式,描述个别细节的时间表...
  • angry_tiger
  • angry_tiger
  • 2016-06-14 10:41:43
  • 613

logrotate机制和原理

转自:http://blog.lightxue.com/how-logrotate-works/ 日志实在是太有用了,它记录了程序运行时各种信息。通过日志可以分析用户行为,记录运行轨迹,查找...
  • ZHOUBANGDING
  • ZHOUBANGDING
  • 2017-01-09 15:10:56
  • 598

cron定时运行jar程序

跟着别人的例子做出来的根本不能运行,现在能运行了.这是我的步骤: 1.工程打包成jar包,复制到 /ETL/lgs目录下 2.  # vi auto.sh,内容如下: (前面看别人的例子,需要带有-c...
  • ronawilliam
  • ronawilliam
  • 2014-01-20 17:39:04
  • 1991
收藏助手
不良信息举报
您举报文章:Cron运行原理
举报原因:
原因补充:

(最多只允许输入30个字)