SDB:自动化任务
目录
作用与安装
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
这样就完成了一个部署
原理
我们先看最前面的东西。
- SHELL 指cron将在其下运行shell
- PATH 指包含在cron搜索路径中的目录。
- 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
- period in days 天数
- delay in minutes 延迟时间
- job-identifier 工作名称
- 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查看时就会发现已经没有任务了。