SDB:自动化任务

跳转至: 导航, 搜索
介绍如何用at cron anacron自动化安排任务

作用与安装

at cron crontab这几个工具都是用来帮助处理一些计划任务或者例行工作的。比如更新软件,定时关机,监视系统日志等。 at 和 corn是系统默认就安装了的。但是anacron则需要另外安装。不过也非常的简单,只要从源里安装就可以了。

sudo zypper install cronie-anacron


cron

启动cron

运行一下命令。

sudo /usr/sbin/cron

该进程会自动转后台。

其实你不需要启动它,它会在系统启动时自动运行,且一直处于潜伏状态。否则怎么帮助我们定时执行任务?

可以用ps(process status)命令来查看

ps auwx | grep cron

我的输出是

root      2060  0.0  0.0   3716  1224 ?        Ss   16:07   0:00 /usr/sbin/cron -n
nirvana   3611  0.0  0.0   4236   768 pts/1    S+   16:20   0:00 grep --color=auto cron

可以看到已经在运行了。


配置crontab文件

crontab文件在目录/etc里面,我们就在这个文件里面写入我们要指定时间运行的命令,脚本或程序。

用vim打开(注意要用root权限)

sudo vim /etc/crontab

打开后在会发现如下内容


SHELL=/bin/sh
PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin
MAILTO=root
#
# check scripts in cron.hourly, cron.daily, cron.weekly, and cron.monthly
#
-*/15 * * * *   root  test -x /usr/lib/cron/run-crons && /usr/lib/cron/run-crons >/dev/null 2>&1



我们在行末添加

0 * * * * userid cp -r ~username/docs ~username/backups

这样就完成了一个部署


原理

我们先看最前面的东西。

  1. SHELL 指cron将在其下运行shell
  2. PATH 指包含在cron搜索路径中的目录。
  3. MALTO 指如果cron运行的命令有输出,那么这个输出就会以电子邮件的形式传送给指定用户。这里就是root

一些发行版里还会有HOME这个选项, 一般认为是指cron应用程序指定的主目录。也许是各个发行版之间的差异,openSUSE里面没有。

这些内容都是可以更改的。

下面看添加的代码 这个代码是我们分成两部分看,从cp开始的是命令,应该是熟悉的,其中~username指的是你的主目录,这个命令就是吧主目录下的docs备份到backups里(当然你要先要有这两个文件夹了)

主要是前面的那些东西,我们一个字段一个字段地来看。

(1)就是那么0了。值得是分钟,取值范围是0到59。0代表的是整点。 (2)就是第一个*。指小时,如果是要每个小时都执行的话就用*(下面的类推) (3)代表日期,范围是1到31 (4)代表月份,范围是1得12(也可以是Jan 到 Dec,用英文缩写可能看上去清楚一点) (5)代表星期,范围是1到7,也可以是Sun到Sat

好了前面几个就是要执行的时间了,那么上面命令执行的时间就是每天的每个整点。

那么

0 0 * * * 

的意思就是每天的0点0分执行。

要注意的是,日期里的Jan之类不区分大小写。还有

* 12 16 * 1

的意思不是说只有16号又是星期天才执行,而是16和星期天都会执行。


(6)就是那个userid,指的是运行命令的用户。 (7)这个就是命令。


稍稍复杂一点的调度

在多个小时执行但不是每一个。

1 0,2,4,6,8,10,12,14,16,18,20,22 * * *

注意,字段之间空格隔开,同一个字段用逗号隔开,逗号两边没有空格。


在一到五周执行

* * * * 1-5


每隔五小时执行

* */5 * * *

还可以把日期范围(如10-16)和步值(如/2)结合。

* 12 10-16/2 * *


管理corn输出

corn的输出都会以电子邮件的方式传送给进程所有者,可以用管道输出以电子邮件的方式传给他人。也可以利用重定向将命令的输出定到某个文件,这样你就可以查看了。

控制访问

指定用户有没有权访问cron,书里提到了cron.allow 和 cron.deny。顾名思义,只要在文件里添加就可以了。我在openSUSE里找了一下,发现openSUSE里只有cron.deny没有cron.allow。 想想也是,一个就够用了。


由于linux往往是多用户的,不是每个人都可以访问/etc/crontab的。每个用户可以创建自己的crontab文件,只要终端输入

crontab -e

这个命令用来编辑或创建用户自己的crontab文件

crontab -l

列出crontab文件的内容(当然是你自己的)

crontab - r

删除crontab文件(同样,是你自己的)


/etc/cron.d 目录

在/etc/crontab当中我们看到了这样的内容

SHELL=/bin/sh
PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin
MAILTO=root

有时候我们对于不同的任务可能需要用不同shell或者PATH,或者单纯的我们需要单独安排一些任务在一个文件里 方便寻找和修改,而不用到crontab里一行一行的找。这时cron.d就有它的用途了。所有在cron.d目录下的文件都起到和crontab一样的作用,并且和crontab使用一样的语法。你可以给这些文件起任意的名字,cron都会 检查它是否需要运行。

查看我/etc/cron.d目录会发现下面有一个dmeventd文件。我们看看它的内容

cat /etc/cron.d/dmeventd

会看到如下输出

# Runs the logwatch script looking for dmeventd syslog messages.
# The setup will run on the following interval:
#        field          allowed values
#      -----          --------------
#      minute            0-59
#      hour               0-23
#      day of month  1-31
#      month            1-12 (or names, see below)
#      day of week   0-7 (0 or 7 is Sun, or use names)
#
# Some samples:
# */5 * * * * /usr/sbin/logwatch --service dmeventd
# This will run every five minutes, every hour, every day of the month, 
# every month of the year, every day of the week.
#
# 0-59 * * * * /usr/sbin/logwatch --service dmeventd
# This will run every minute, every hour, every day of the month, 
# every month of the year, every day of the week.
# (Note: this call also be accomplished with a */1 instead of 0-59)

 30 * * * * root /usr/sbin/logwatch --service dmeventd


这是由于我安装了logwatch(一个监视日志的程序),它自动生成的一个文件,你可以看它的最后一行部署,格式和crontab是一模一样的。

cron.hourly cron.daily cron.weekly cron.monthly cron.yearly

顾名思义,这些目录下储存的是每小时,每天,每星期,每月和每年所要运行的任务的路径,一般你不需要去动它,但是在下面讲到anacron的时候我们会碰到它,所以在这里知道一下。


anacron

作用

因为cron任务可能在系统关闭运行,那么就需要用anacron来补充。

其实anacron无需配置,你只要安装它它就会自动工作。而且是通过cron来运行,你可以用以下命令检查。

# ll /etc/cron*/*ana*

我的输出是

-rwxr-xr-x 1 root root 424 2月   8 21:34 /etc/cron.hourly/0anacron

我们之前讲过了,cron.hourly里放着的是每小时需要执行的任务的文件,文件名以 0 开头可以让这个命令在同样时间里执行的命令里最先执行。这是为了保障anacron正确判断任务是否执行。

我们来看看0anacron的内容。

cat /etc/cron.hourly/0anacron

我们可以看到输出

#!/bin/bash
#in case file doesn't exist 
if test -r /var/spool/anacron/cron.daily; then
    day=`cat /var/spool/anacron/cron.daily`
fi
if [ `date +%Y%m%d` = "$day" ]; then
    exit 0;
fi

# in case anacron is already running,
# there will be log (daemon won't be running twice).
if test -x /usr/bin/on_ac_power; then
    /usr/bin/on_ac_power &> /dev/null
    if test $? -eq 1; then
    exit 0
    fi
fi
/usr/sbin/anacron -s


我们可以看到它会检查cron的任务是否执行。

配置

之前说过其实我们无需配置,但是我们还是来看看anacron的配置文件

cat/etc/anacrontab

输出如下:

# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

#period in days   delay in minutes   job-identifier   command
1       5       cron.daily              nice /usr/lib/cron/run-crons /etc/cron.daily
7       25      cron.weekly             nice /usr/lib/cron/run-crons /etc/cron.weekly
@monthly 45     cron.monthly            nice /usr/lib/cron/run-crons /etc/cron.monthly


  1. period in days 天数
  2. delay in minutes 延迟时间
  3. job-identifier 工作名称
  4. command 运行指令

可以看到,它已经帮你配置好了。你只要在crontab里配置好任务就好了。


at

用来执行一次性的任务。

很简单终端输入

at 21:00


会出来at>提示符

比如我们我们输入

at> cp -r ~username/docs ~username/backups 

完了Crtl + D退出

用atq可以查看是否安排好了

atq

输出

3       2013-06-12 21:00 a nirvana

如果要删除则使用atrm + 任务编号。用atq查看时最前面那个数字就是了,这里就是3

atrm 3

完了你再用atq查看时就会发现已经没有任务了。