使用crontab命令添加计划任务
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的使用水平吧!
参考链接
使用crontab命令添加计划任务的更多相关文章
- Linux下crontab命令添加Kettle作业定时任务
1. 确保作业 $KETTLE_HOME/kitchen.sh -file=/data1/testdata/testkjb.kjb 或转换 $KETTLE_HOME/pan.sh -file=/dat ...
- Linux下crontab命令的用法
cron来源于希腊单词chronos(意为“时间”),是linux系统下一个自动执行指定任务的程序.例如,你想在每晚睡觉期间创建某些文件或文件夹的备份,就可以用cron来自动执行. 服务的启动和停止 ...
- Linux的crontab 命令
crontab 命令 简介 从输入设备读取指令,并将其存放于 crontab 文件中,以供之后读取和执行,即:crontab 是 Linux 系统中添加计划任务,定时执行一些必要的脚本所必不可少的工具 ...
- Linux crontab 命令格式与举例
每五分钟执行 */5 * * * * 每小时执行 0 * * * * 每天执行 0 0 * * * 每周执行 0 0 * * 0 每月执行 0 0 1 ...
- Linux系统下使用crontab添加计划任务的方法
在服务器中添加定期执行的任务,在很多情况下是非常必要的.比如,每天清理一次/tmp目录下的文件;没几分钟检查某一守护进程是否正常等等.这样计划任务就显得尤为方便.下面将介绍如何在Linux系统中 ...
- 7.控制计划任务crontab命令
at 命令是针对仅运行一次的任务,循环运行的例行性计划任务,linux系统则是由 cron (crond) 这个系统服务来控制的Linux 系统上面原本就有非常多的计划 性工作,因此这个系统服务是默认 ...
- Windows系统使用vbs脚本或bat脚本强制杀死指定所有进程 vbs实现循环持续写入内容到vbs打开开的记事本 使用vbs、bat添加windows计划任务 使用cmd schtasks命令添加windows计划任务
以下脚本windows7下成功运行过,脚本也可以windows计划任务程序一起组合使用 新建一个记事本文档粘贴下面代码后将新建的记事本文档重命名下面对应的脚本名就能使用了: 添加windows计划任务 ...
- OSX系统添加定时任务 Linux crontab命令 定时执行py 文件 任务
#输出日志 #将日志输入到2.log文件中无论错误还是正确02 15 * * * . ~/xad/pyenv/xadserver/bin/activate && cd /root/xa ...
- Linux运维技术之详解任务计划(crontab命令)
crontab命令 按照预先设置的时间周期(分钟.小时.天……)重复执行用户指定的命令操作,属于周期性计划任务 (1).先来看一下/etc/crontab文件的内容: [root@localhost ...
随机推荐
- week5-Link Layer
Technology:Internets and Packets course Layer 1 : Link Introduction/The Link Layer moving from histo ...
- python文本替换
file_data = '' str1 = ' str2 = ' with open(loginfofile, 'r+') as f: #打开文件,r+模式,读取 for line in f: if ...
- Graph Database & 图形数据库
Graph Database 图形数据库 https://en.wikipedia.org/wiki/Graph_database cayley https://github.com/cayleygr ...
- 使用AutoMapper实现Dto和Model的自由转换(下)
书接上文.在上一篇文章中我们讨论了使用AutoMapper实现类型间1-1映射的两种方式——Convention和Configuration,知道了如何进行简单的OO Mapping.在这个系列的最后 ...
- tomcat 启用NIO
从Tomcat6.0以后, Java开发者很容易就可以是用NIO的技术来提升tomcat的并发处理能力. <Connector port="8080" protocol=&q ...
- js判断checkbox是否选中
$('.div0 .checkbox1').prop('checked')选中返回 true未选中返回 false $('.div0').prop("checked", true) ...
- 【BZOJ5138】[Usaco2017 Dec]Push a Box(强连通分量)
[BZOJ5138][Usaco2017 Dec]Push a Box(强连通分量) 题面 BZOJ 洛谷 题解 这题是今天看到萝卜在做然后他一眼秒了,我太菜了不会做,所以就来做做. 首先看完题目,是 ...
- HGOI 20181027 幻象(概率DP)
40 pts: 考场上打了40分暴力,理论的话就是概率树,把每一个状态去去到各个带权(概率)的和就是答案 最终处理的话就是dfs出01序列0代表没有幻象,1代表出现幻象然后在每一次dfs出一段序列的时 ...
- 自动更新前加密:Clickonce用法
一.加密dll 新建一个windows form application: static void Main(string[] args) { Process. ...
- IIS并发连接数及性能优化
如果要查看IIS连接数,最简单方便的方法是通过“网站统计”来查看,“网站统计”的当前在线人数可以认为是当前IIS连接数.然而,“网站统计”的当前在线人数统计时间较长,一般为10分钟或15分钟,再加上统 ...