cron & crontab

来源:互联网 发布:linux mysql 安装 编辑:程序博客网 时间:2024/06/04 20:08

cron & crontab

每个人应该都会有这样的需求: 每天, 或是每个星期 要做某一个工作, 并且这个工作是定期去做的, 这个工作可能是执行一条命令, 或是执行一个脚本. 这时你可能会用到cron服务.

cron服务一共分两个部分: cron服务, crontab.


cron服务

cron服务默认是开启的, 也不需要我们做什么特殊的配置, 我们只要知道它大概的工作原理就好了.

cron会检查 /var/cron/tabs/ 目录下的crontab文件, 这些文件都是用 /etc/passwd 文件中的用户帐号的命名的. 被查找到的crontab文件会被加载到内存中. cron 同时还会检查 /etc/crontab 文件, 这个文件是系统的crontab文件, 格式和我们通常用到的crontab文件不太相同, 这里就不做说明了.

cron 会每分钟执行一次上面说到的检查, 检查时会确定crontab文件中的每一条任务是否应该在当前这一分钟执行. 需要注意的是cron只会检查当前账户对应的那个crontab文件, 但是/etc/crontab 文件会在任何账户下都被检查. 当crontab中的任务时, 任何输出都会默认发送到crontab对应的账户邮箱中(/var/mail/)

另外, cron还会每分钟检查一下存放crontab文件的目录的修改时间, 如果修改时间发生变化, 就将所有的crontab文件重新加载到内存中.


crontab

crontab命令是用来添加,修改和删除crontab文件中的任务的.

如果在/var/cron/ 目录中有 allow 文件, 那么只有allow文件中列出来的用户可以使用crontab命令. 如果 不存在allow文件, 但是存在一个deny文件, 那么deny文件中列出来的用户将被禁止使用crontab命令. 如果这两个文件都不存在, 那么就要根据 site-dependent configuration parameters 来确定了, 有可能是只有root才能使用这个命令, 或者是所有用户都可以使用这个命令.

下面是crontab命令用到的一些参数:

-u

指定crontab命令将要修改的是哪一个用户的crontab文件, 如果没有指定该参数, 则默认是当前账户的crontab文件.
这里需要注意的是在普通账户下使用su提权后, 如果使用crontab命令, 这会让crontab命令迷惑, 所以这时一定要使用-u参数来指定用户.

-l

列出当前crontab文件中的任务.

-r

删除当前用户的crontab文件.

-e

编辑当前的crontab文件, 使用默认的文本编辑器打开crontab文件, 一般应该都是vi. 可以通过修改EDITOR或是VISUAL环境变量来修改默认的编辑器.

crontab文件的格式

# 文件格式说明 
# |----------- 分钟 (0 - 59) 
# | |--------- 小时 (0 - 23) 
# | | |------- 日 (1 - 31) 
# | | | |----- 月 (1 - 12) 
# | | | | |--- 星期 (1 - 7) 
# * * * * * 被执行的命令

举例:

1 * * * * ls -l 
这一条任务的含义是 在每个小时一分钟的时候 执行命令: ls -l
其中 * 表示 每分钟 或是 每小时 或是 每天 等等.

*/3 * * * * ls -l 
这一条任务的含义是 每隔3分钟执行命令 ls -l 
这就不用我解释了吧

重定向输出. 前面已经提到, crontab中的任务默认将输出作为邮件发送给你, 但有时你并不关心输出, 这是你就可以这样写:

* * * * * ls -l > /dev/null 2 > &1 
这句话的意思是将原本输出到标准输出的内容输出到 /dev/null, 因为 /dev/null 表示空设备, 所以原本该输出的东西就不输出了.
2 > &1 表示 将错误信息输出到和标准输出相同的地方, 即 /dev/null 
注: 1 表示标准输出, 2 表示错误输出, 至于 & 符号, 你可以参照一下C++中的引用, 我就是这么理解的 :)

还有的时候, 你可能想让原本输出到标准输出的内容还是输出到标准输出, 这时候你可以用下面的方法:

首先使用 tty 命令显示你当前的 tty 编号, 例如我的是 /dev/ttyv1
接着将输出重定向到ttyv1:
* * * * * ls -l > /dev/ttyv1
原创粉丝点击