简单、严谨、安全 —— Dcron 简介

计划任务


在 UNIX 操作系统中,通常都有一个 crond
守护进程来定期执行设定好的计划任务,它能给服务器管理带来许多便利,同时可以大大节省管理员的时间和精力。比如,管理员希望每天凌晨 3:00
对数据库进行一次备份,有了 crond 的帮助,管理员就不必每天在睡得最香的时候起床了,crond
能够按照配置文件的指引自动完成这个任务。

在GNU的世界里,最不缺乏的就是选择,同样,这个 crond 也有多种不同的实现,常见的有:fcron 、dcron 、vixie-cron 三种。本文将介绍其中的
dcron 实现,它的特点就是“简单、严谨、安全”。

Dcron

Dcron 3.2 版本以前是 Dillon 的作品,现在已经交给 Jim Pryor 维护,其主页是:http://www.jimpryor.net/linux/dcron.html

Dcron 将所有任务都强制交给 /bin/sh 执行,也就是使用"/bin/sh -c"来运行任务。Dcron
不允许你在配置文件中指定环境变量或使用其它高级特性,这些事情最好放到脚本中去做。

Dcron
启动后首先扫描普通用户配置目录,寻找以/etc/passwd中用户名命名的文件,并将其作为该用户的配置文件。然后扫描root用户配置目录,并将其下所有文件都作为root用户的配置文件[笔者本人建议不要使用root配置目录,而是在普通用户配置目录中放置一个"root"文件,效果完全相同]。[注意]配置目录下所有文件名含有句点(.)的文件和无法匹配用户名的文件都会被忽略。

Dcron
在运行时会每分钟检查一次配置文件目录中的"cron.update"文件。你可以将已经被修改或删除的配置文件的名字(也就是用户名)添加到"cron.update"文件中(一行一个),这样就可以通知
Dcron 配置文件已经发生变化。不过,即使没有"cron.update"文件,Dcron 也会每小时自动重新扫描一次配置目录。

Dcron 有许多内置的限制以防止其被误用。其中最重要的是:每个配置文件最大256行规则。每行规则最长1020字符。

Dcron 并不使用 Sysklogd 记录日志,一般的方法是直接将命令的结果重定向到日志文件。

Dcron 的执行细节:它必须至少运行一个任务。它首先创建两个进程自己拥有的临时文件 O_EXCL 和 O_APPEND
存储所有输出,然后 fork() 出子进程并将其身份切换到该任务的属主,然后使用 exec 函数执行"/bin/sh
-c"来运行任务,但是 O_EXCL 和 O_APPEND 始终由守护进程所有,以防止被用户恶意修改。任务完成后 crond
会校验没有安全防护的 mail 文件,如果它被新增了内容,那么就以任务属主的身份使用 sendmail 将修改过的 mail
文件发送给其属主。crond 不会在任务执行期间保持打开文件描述符,因为这样做可能会导致文件描述符被耗尽。crond
总是在每一分钟的开始时刻检查当前是否有事情可做,这种检查的效率很高,几乎不消耗任何 CPU 资源。

如果轮到某一条命令执行的时候,先前启动的命令尚未执行结束,那么将跳过此次执行。比如,如果设定每分钟执行一次"sleep
70",实际效果将是每两分钟执行一次。如果你不喜欢这样,可以在命令之后加上"&"转入后台执行,这样就不会受此影响了。

编译与安装

Dcron 是一个标准的 ANSI C 程序,理论上可以使用任何符合标准的编译器进行编译(推荐使用
GCC)。但事实上,源代码中切换用户身份的操作是特定于Linux的方式,所以,只建议在Linux上编译和安装。

编译之前你需要详细阅读 Makefile 和 defs.h 文件,并根据你的需要进行修改。比如作者本人经常进行这样的修改:

sed -i -e‘s|/var/spool/cron/crontabs|/etc/crontabs|‘ -e‘s|/etc/cron.d|/share/empty|‘ defs.h

这个命令的作用是将配置文件的默认目录位置调整到"/etc/crontabs",并将root用户配置文件的默认目录位置调整到"/share/empty"。

然后使用下面的命令进行编译和安装:

make CFLAGS="$CFLAGS $LDFLAGS"
install -o 0 -g 0 -m 0500 crond /bin/crond
chown 0:0 /etc/crontabs /share/empty
chmod 1700 /etc/crontabs /share/empty

请注意在安装时为 crond 及其配置目录设置的权限。

crond 通常在系统启动的时候由 /etc/rc.local 启动。在启动脚本中通常使用"-l8"指定日志等级。由于 Dcron
并不使用 Sysklogd 记录日志,所以一般直接将命令的结果重定向到日志文件。比如:

/bin/crond -l8 >> /var/log/crond.log 2>&1

命令行选项

语法

crond [-l#] [-d#] [-f] [-b] [-c directory] [-s directory]

选项说明


-l<日志等级>

设置日志等级(0-8),等级越低日志越详细,默认为"8"。

-d<调试等级>

设置调试等级,默认为"0"。使用这个选项会同时将日志等级设为"0",并导致 crond 作为前台进程运行。

-f

在前台运行

-b

在后台运行。这是默认值,除非你使用了 -d 选项。

-c 目录

指定配置文件目录,默认值是 /var/spool/cron/crontabs ,可以在 defs.h
文件中修改这个默认值[我一般修改成 /etc/crontabs]。

-s 目录

指定root用户配置文件目录,默认值是 /etc/cron.d ,可以在 defs.h 文件中修改这个默认值[我一般修改成
/etc/crontabs]。

配置文件语法

配置文件的格式与 vixie cron 类似,但是缺少一些高级特性,比如不允许在配置文件中使用环境变量。

空白行以及以"#"开头的行将被忽略。

配置文件中的每一行都需要指定5个时间字段+1个命令字段,也就是:

分钟(0-59)  小时(0-23)  日(1-31)  月(jan-dec)  星期(sun-sat)   命令

每个字段都可以指定一个范围(比如:feb-nov),或者逗号分隔的清单(比如:1,5,8,23),或者星号(*)代表全部。

月份和星期除了数字,还可以使用字符串缩写,具体如下:
1-12月:jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec
周日-周六:sun,mon,tue,wed,thu,fri,sat

如果你同时指定了每周中的某一天和每月中的某一天,那么两者同时有效,也就是这个任务会在每周的这一天执行,同时也在每月的这一天执行。

下面是几个例子:

# 全年每分钟执行一次
* * * * * /bin/false

# 每天上午 6:10 执行一次
10 6 * * * date

# 每年 4月2日 22:25 执行一次
25 22 2 apr * /bin/true

# 每周一、周二、周三 上午 2:00 6:00 11:00 22:00
# 或者 每月4号 上午 2:00 6:00 11:00 22:00 执行一次
0 2,6,11,22 4 * mon-wed date >>/var/log/messages 2>&1


命令部分将使用

/bin/sh -c 命令

方式执行。

通常将命令的结果重定向到一个日志文件,否则默认将输出到 stdout 或 stderr
,并且同时使用sendmail发送到任务的属主。如果你希望为某些特别的用户(比如
UUCP)利用这个sendmail机制,最好为这个用户设置一个别名以将邮件重定向到 root 或 postmaster
之类的用户。

时间: 2024-10-13 20:19:36

简单、严谨、安全 —— Dcron 简介的相关文章

简单的Hibernate入门简介

其实Hibernate本身是个独立的框架,它不需要任何web server或application server的支持.然而,大多数的Hibernate入门介绍都加入了很多非Hibernate的东西,比如: Tomcat, Eclipse, Log4J,Struts, XDoclet, 甚至JBoss.这容易让人产生Hibernate复杂难懂的误解,特别是打击了初学者的积极性. 在这篇文章将不涉及Eclipse, log4j, Struts, Tomcat, XDoclet,和JBoss.本文的

ELK系列三:Elasticsearch的简单使用和配置文件简介

1.定义模板创建索引: 首先定义好一个模板的例子 { "order":14, "template":"ids-1", "state":"open", "settings":{ "number_of_shards":1 }, "mappings":{ "warnning":{ "properties":{ &q

NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象

一.了解NSUserDefaults以及它可以直接存储的类型 NSUserDefaults是一个单例,在整个程序中只有一个实例对象,他可以用于数据的永久保存,而且简单实用,这是它可以让数据自由传递的一个前提,也是大家喜欢用它保存简单数据的一个主要原因. 使用 NSUserDefaults 存储自定义对象的最初,我们必须认识NSUserDefaults可以存储哪一些类型的数据,下面一一列出: NSUserDefaults支持的数据类型有:NSNumber(NSInteger.float.doubl

安卓第十五天笔记-图形图像一些简单处理

安卓第十五天笔记-图形图像一些简单处理 多媒体编程简介--图形的一般处理 1.计算机中图形计算的大小 一般白色就是0,黑色就是1 单色位图: 8位表示一个字节, 大小:长*宽/8,表示大小,还有一些文件信息如创建时间,什么工具创建之类的 24位位图 一个像素表示24位 大小:长*宽*24/8 256色 1个像素可以表示256种颜色 一个字节它的长度刚好是256 ,那么一个像素点就是一个字节 大小:长*宽 安卓中默认使用32位的 位图的缺陷 放大到一定的比例会出会出现失真与锯齿形状 占用很大的存储

keepalived简单原理及配置参数介绍_2015101601

>>>keepalived是什么? keepalive是HA(High Available)高可用集群的一种实现方案,用来防止系统架构中的单点故障.其是vrrp协议的实现. >>>vrrp协议工作简介 vrrp(Virtual Router Redundancy Protocol),即是虚拟路由冗余协议.用于实现多个路由器的高可用性.其工作原理是将一组路由器虚拟成一个虚拟路由器对外提供一个或多个IP地址.在这组路由器当中,实际对外提供IP地址的路由器被称为MASTER,

grunt简单教程

Grunt简单教程 1.grunt简介 Grunt是一个基于任务的命令行工具,依赖于node.js环境. 它能帮你合并js文件,压缩js文件,验证js,编译less,合并css,还可以配置自动任务,单元测试等等,grunt有非常多的插件,可以满足你的大部分需求. 2.怎么安装 先介绍一些东西: npm是node.js的包管理器通过npm可以下载安装nodejs的模块包 cnpm是淘宝 npm镜像,用此代替官方版本(只读),同步频率目前为10分钟一次. 安装cnpm方法 npm install -

简单介绍及环境搭建

简单介绍 1,简介 mongodb是一种面向文档的非关系型数据库(NoSQL). mongodb有三元素,数据库,集合和文档.数据库跟sql server中的数据库概念类似,集合相当于sql server中的数据表,文档相当于sql server中的行. mongodb的文档采用的是BSON(Binary JSON),一种类似于JSON的格式,但是是二进制序列化的.如下: { 'id':1, 'author':'NinGoo', 'title':'白话MongoDB(一)', 'content'

BAT&amp;nbsp;批处理脚本教程(如果可以用电脑让事情变的更简单,何不让它变得更简单呢!)

第一章 批处理基础 第一节 常用批处理内部命令简介批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD.这些命令统称批处理命令. 小知识:可以在键盘上按下Ctrl+C组合键来强行终止一个批处理的执行过程. 了解了大概意思后,我们正式开始学习.先看一个简单的例子! @echo off echo "欢迎来到非常BAT!" pause 把上面的3条命令保存为文件test.bat或者test.cmd然后执行, 他就会在屏幕上显示以下二

Qt学习 之 Socket通信(世界上最简单的例子了)

最近写大作业用到Qt的Socket部分,网上关于这部分的资料都太过复杂,现在总结一下一些简单的应用.有机会可以给大家讲讲用Socket传送文件的代码. 这里主要讲解如何实现TCP和UDP的简单通信. socket简介 在LINUX下进行网络编程,我们可以使用LINUX提供的统一的套接字接口.但是这种方法牵涉到太多的结构体,比如IP地址,端口转换等,不熟练的人往往容易犯这样那样的错误.QT中提供的SOCKET完全使用了类的封装机制,使用户不需要接触底层的各种结构体操作.而且它采用QT本身的sign