Ubuntu 16.04,
计划任务 就是 有(时间)计划地执行(做)任务,有计划 包括 定时执行(在哪些时间点执行任务)、按照周期执行(每隔多少时间执行任务)。
那么,什么是任务呢?就是 自己想要干的事情——基于这台Ubuntu及其连接的网络(局域网、Internet),自己想干点什么。
自己想干的事情,受制于所在Ubuntu所安装的软件或命令,这个需要明确。
在Ubuntu中,简单的事情,一条命令就可以解决了,比如,ls、cd等,而复杂的事情就需要 编写shell脚本甚至计算机程序 了。
无论是 简单的事情,还是 复杂的事情,从crontab命令的角度来看,都是 任务,都可以为其 执行时间 做计划。
本文介绍下自己今天使用crontab命令做计划任务的一些经验。
怎么用crontab命令?
简单的用法可以在终端输入crontab --help查看其usage:
注意下面的红色字体部分,其实,crontab命令时没有--help选项的,因为自己用错了,所以,系统给出了它的简单用法。
在usage:之后,可以看到crontab命令的两种用法。
$ crontab -help crontab: invalid option -- 'h' crontab: usage error: unrecognized option usage: crontab [-u user] file crontab [ -u user ] [ -i ] { -e | -l | -r } (default operation is replace, per 1003.2) -e (edit user's crontab) -l (list user's crontab) -r (delete user's crontab) -i (prompt before deleting user's crontab)
复杂的用法可以使用man命令查看:
man crontab、man 5 crontab、man cron
特别说明的是,crontab命令时针对Linux用户做计划任务 列表 的,每个Linux用户都会有自己的计划任务 列表,这个计划任务 列表 可以通过crontab -u username -e命令进行编辑(实际情况会更复杂)。
crontab命令涉及到的几个文件:
-/var/spool/cron目录,及其下的crontabs目录
其中的crontabs包含了每个用户的计划任务列表,以用户的名字命名。当然,有计划任务的用户的名字才会显示在其中。
其它两个目录是给at、batch等计划任务命令使用的,请自行查找这两个命令的用法,本文不做介绍。
注意,无法使用cd或cd命令进入crontabs。
/var/spool/cron$ ls
atjobs atspool crontabs
-/etc/目录下包含cron的文件及目录
其中的crontab包含了root用户的计划任务,可以在其中添加自己的计划任务,,最开始自己也是这么做的,后来,改为在当前用户的根目录中新建包含计划任务的文件。
/etc$ ls | grep cron
cron.d
cron.daily
cron.hourly
cron.monthly
crontab
cron.weekly
-/etc/init.d/cron脚本
用来控制crontab服务的启停等。
/etc$ service cron
* Usage: /etc/init.d/cron {start|stop|status|restart|reload|force-reload}
还可以使用whereis crontab、whereis cron来查看两者所在位置:
~$ whereis crontab crontab: /usr/bin/crontab /etc/crontab /usr/share/man/man1/crontab.1.gz /usr/share/man/man5/crontab.5.gz ~$ whereis cron cron: /usr/sbin/cron /etc/cron.weekly /etc/cron.hourly /etc/cron.monthly /etc/cron.d /etc/cron.daily /usr/share/man/man8/cron.8.gz
注意,在Windows 10家庭中文版上安装的Bash on Ubuntu on Windows中,/etc/init.d中也是有cron脚本的,但是,此脚本没有被安装,即没有 随机启动。安装后会怎样呢?在某些/etc/rc*.d/目录中会出现cron脚本的软连接。
说了很多,下面开始自己的实践介绍。
1.使用/etc/crontab文件添加 简单计划任务——命令
进入/etc目录,使用sudo vim crontab打开文件:默认情况下,只有属于root的计划任务。
# /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file # and files in /etc/cron.d. These files also have username fields, # that none of the other crontabs do. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # m h dom mon dow user command 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) #
在最后一行下面,添加一些其它用户的计划任务——格式参考root用户的:
每个5分钟,将执行date获取的时间附加到用户主目录下的filename.txt文本文件中。
*/5 * * * * username date >> /home/username/filename.txt
说明,参考链接中有更多关于计划任务的时间的设置介绍;
说明,在计划任务列表文件中,除了配置SHELL、PATH环境变量外,还可以配置MAILTO、HOME环境变量;其中,MAILTO配置为空("")时,表示执行计划任务时不发送邮件,否则,一旦执行了计划任务,就会发送邮件到/var/mail/username中——在用户username在终端执行命令时,如果有新邮件产生,会提示用户——You have new mail in /var/mail/username!在刚开始学习crontab命令时,可以通过这个邮件文件查看到很多错误信息,进而纠正自己添加的计划任务。
上面的计划添加完毕后,不用重启cron服务,因为其会每隔一分钟检查一次是否有计划任务要执行——会不会太快、是否需要调整?
若计划任务执行正常,用户可以在主目录的filename.txt中看到date的信息(下面是示例,简单计划任务的示例还是很好造的):
$ cat filename.txt Sun Aug 26 12:28:01 CST 2018 Sun Aug 26 12:33:01 CST 2018 Sun Aug 26 12:38:01 CST 2018
2.使用/etc/crontab文件添加 复杂计划任务——脚本
脚本,这里单指shell脚本。
说明,对于Python等脚本文件,应该也是可以执行的,不过,后者可以归属为上面第一种情况——python3 python脚本,,未实践之推测。
shell脚本可以简单,也可以复杂。鉴于孤水平有限,就做写了一些简单的shell脚本进行测试——进入自己的Python虚拟化目录、激活虚拟化目录、执行其中的爬虫程序,最后把计划任务执行时间写到主目录下的文件中。
参考:Shell脚本教程
建立shell脚本后,使用chmod +x filename.sh给脚本添加 可执行 权限。
然后,使用脚本文件的绝对路径——/home/username/filename.sh——替换掉上面的计划任务中的date开始的部分:
*/5 * * * * username /home/username/filename.sh
就这样,好啦!下面就等着脚本按照计划执行吧!
这样看来,其实脚本也是一个命令。
当然,在参考链接中还有更多关于如何修改/etc/crontab的介绍,有需要的话还需细读。
3.在用户主目录下建立自己的计划任务列表文件并执行其中的计划任务
将/etc/crontab拷贝到用户主目录下,删除其中的属于root的计划任务,然后添加用户的计划任务。
千万注意!在添加的计划任务里面不需要添加用户名,即时间计划后面直接就是 命令或者脚本,否则,计划任务无法执行,如下:
失败:*/5 * * * * username /home/username/filename.sh
成功:*/5 * * * * /home/username/filename.sh
怎么知道这个错误原因的呢?通过/var/mail/username文件,其中会显示如下信息:
/bin/sh: 1: username: not found
说的有些超越了,回到上面写好了计划任务列表文件,现在,添加此文件到用户的计划任务中——默认情况下,用户是没有计划任务的。添加方法:
crontab crontab-filename
添加时,crontab会检查文件是否符合计划任务的格式,若是格式不符合,则报错,且添加失败。总之,计划任务列表文件不是随随便便的一个文本文件,有格式要求,这也是孤拷贝/etc/crontab再进行修改的原因。
添加成功后,使用crontab -l可以查看当前用户的计划任务列表,使用crontab -e可以对其编辑,使用crontab -r可以删除(没用过)。
就自己目前所知,每一个用户只能有一个计划任务列表,在添加完毕后——从无到有,/var/spool/cron/crontabs/目录下会多了一个以用户名命名的文件——即其计划任务列表。
说明:在调试阶段,自己没有设置MAILTO,此时会有邮件产生,在计划任务设置正确后,自己将MAILTO设置为了空(""),否则,爬虫程序产生的很多结果都会出现在邮件中。
自己的难点:HELP!!!
在当前用户没有配置计划任务时,不知道怎么操作crontab -e打开的交互框。
后记
通过使用crontab命令,孤将自己的爬虫程序设置为了自动运行了,轻松不少啊!
不过,自己是达到了基本能用crontab命令的阶段了吧——实现了自己需要的功能,对于更高级的应用,还需要更多的阅读和实践,比如,自己对/etc/下crontab相关的daily、hourly、monthly等不是很熟悉,自己对cron.allow和cron.deny也不熟悉……
要玩转Linux,Shell脚本真的很重要!Linux用的怎么样,很重要的一个衡量标准就是Shell的使用水平吧!
参考链接