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的使用水平吧!

参考链接

Linux中的cron计划任务配置详解

crontab命令

使用crontab命令添加计划任务的更多相关文章

  1. Linux下crontab命令添加Kettle作业定时任务

    1. 确保作业 $KETTLE_HOME/kitchen.sh -file=/data1/testdata/testkjb.kjb 或转换 $KETTLE_HOME/pan.sh -file=/dat ...

  2. Linux下crontab命令的用法

    cron来源于希腊单词chronos(意为“时间”),是linux系统下一个自动执行指定任务的程序.例如,你想在每晚睡觉期间创建某些文件或文件夹的备份,就可以用cron来自动执行. 服务的启动和停止 ...

  3. Linux的crontab 命令

    crontab 命令 简介 从输入设备读取指令,并将其存放于 crontab 文件中,以供之后读取和执行,即:crontab 是 Linux 系统中添加计划任务,定时执行一些必要的脚本所必不可少的工具 ...

  4. Linux crontab 命令格式与举例

    每五分钟执行  */5 * * * * 每小时执行     0 * * * * 每天执行        0 0 * * * 每周执行       0 0 * * 0 每月执行        0 0 1 ...

  5. Linux系统下使用crontab添加计划任务的方法

     在服务器中添加定期执行的任务,在很多情况下是非常必要的.比如,每天清理一次/tmp目录下的文件;没几分钟检查某一守护进程是否正常等等.这样计划任务就显得尤为方便.下面将介绍如何在Linux系统中 ...

  6. 7.控制计划任务crontab命令

    at 命令是针对仅运行一次的任务,循环运行的例行性计划任务,linux系统则是由 cron (crond) 这个系统服务来控制的Linux 系统上面原本就有非常多的计划 性工作,因此这个系统服务是默认 ...

  7. Windows系统使用vbs脚本或bat脚本强制杀死指定所有进程 vbs实现循环持续写入内容到vbs打开开的记事本 使用vbs、bat添加windows计划任务 使用cmd schtasks命令添加windows计划任务

    以下脚本windows7下成功运行过,脚本也可以windows计划任务程序一起组合使用 新建一个记事本文档粘贴下面代码后将新建的记事本文档重命名下面对应的脚本名就能使用了: 添加windows计划任务 ...

  8. OSX系统添加定时任务 Linux crontab命令 定时执行py 文件 任务

    #输出日志 #将日志输入到2.log文件中无论错误还是正确02 15 * * * . ~/xad/pyenv/xadserver/bin/activate && cd /root/xa ...

  9. Linux运维技术之详解任务计划(crontab命令)

    crontab命令 按照预先设置的时间周期(分钟.小时.天……)重复执行用户指定的命令操作,属于周期性计划任务 (1).先来看一下/etc/crontab文件的内容: [root@localhost ...

随机推荐

  1. 学习构建一个简单的wcf服务

    入门,构建第一个WCF程序 1.服务端 建立一个控制台应用程序作为Server,新建一个接口IData作为服务契约.这个契约接口一会儿也要放到Client端,这样双方才能遵循相同的标准.别忘了添加对 ...

  2. 【华为机试】—— 15.求int型正整数在内存中存储时1的个数

    题目 解法 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner ...

  3. 开发Spring Shell应用程序

    2 开发Spring Shell应用程序 向shell提供命令非常简单,需要学习的注解很少.该命令的实现风格与使用依赖注入的应用程序的开发类相同,您可以利用Spring容器的所有特性来实现您的命令类. ...

  4. 架构师成长之路1.2-多功能系统信息统计工具dstat

    点击返回架构师成长之路 架构师成长之路1.2-多功能系统信息统计工具dstat dstat命令是一个用来替换vmstat.iostat.netstat.nfsstat和ifstat这些命令的工具,是一 ...

  5. 【BZOJ1967】[AHOI2005]穿越磁场(最短路)

    [BZOJ1967][AHOI2005]穿越磁场(最短路) 题面 BZOJ 洛谷 题解 一个显然的思路是这样的,我们的正方形的边长把整个平面割成了若干块,显然每个联通块都可以看着做一个点,那么接下来只 ...

  6. JVM总结(一):概述--JVM对象探秘

    这一节我们来讨论一下JVM对象建立过程. JVM对象探秘 对象的建立 对象的内存布局 对象的访问定位 JVM对象探秘 对象的建立 对象的建立过程   图一:对象建立过程 1.类加载检查. 当JVM检测 ...

  7. Spring Boot 1.4 单元测试

    在1.3中单元测试这样子的类似代码: // SpringJUnit支持,由此引入Spring-Test框架支持! @RunWith(SpringJUnit4ClassRunner.class) // ...

  8. CSS规范 - 命名规则--(来自网易)

    使用类选择器,放弃ID选择器 ID在一个页面中的唯一性导致了如果以ID为选择器来写CSS,就无法重用. NEC特殊字符:"-"连字符 "-"在本规范中并不表示连 ...

  9. javascript私有静态成员

    就私有静态成员而言,指的是成员具有如下属性:1.以同一个构造函数创建的所有对象共享该成员.2.构造函数外部不可访问该成员. //构造函数 var Gadget = (function(){ //静态变 ...

  10. 20155215 2016-2017-2 《Java程序设计》第7周学习总结

    20155215 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 第十二章 lambda语法:Lambda去重复,回忆DRY原则,Lambda表达式可读性更好 ...