crontab和crond分析

简介: 目录 目录 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使用问题。

目录

目录 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版本crontabcrond。一般可通过执行“man crontab”查看AUTHOR是不是“Paul Vixie”。

2. 基本概念

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

2) crontabcrond的命令行工具,通过它来增删改定时任务,不同用户的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专题:http://blog.chinaunix.net/uid/20682147/cid-224920-list-1.html

相关文章
|
5月前
|
Shell Linux Python
Crond计划任务和用户权限提升
Crond计划任务和用户权限提升
43 1
|
5月前
|
监控 Linux
Crond计划任务的简单使用
crond是Linux系统中的一个守护进程,负责定期执行预设的任务,也称为计划任务。它可以根据用户的需求,在指定的时间、日期或周期性地执行特定的命令或本crond的用是自动化和定时执行任务,可以用来实现系统维护、数据备份、监控等功能。通过ond,用户可以在系统闲置或指定的时间段执行一些重复性的任务,免手动操作带来的繁琐和错误。
50 0
|
MySQL 关系型数据库 Shell
|
Shell Linux 调度
|
Shell 调度 Linux