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. TClientDataSet[9]: 计算字段和 State

    TClientDataSet 中计算字段有两种: Calculated(计算字段).InternalCalc(内部计算字段). 两者区别是: Calculated 在每次需要时都要重新计算; Inte ...

  2. 跨语言通信方案的比较—Thrift、Protobuf和Avro

    Thrift由Facebook开源的一个RPC框架,用来进行可扩展且跨语言的服务的开发,使得各种编程语言间无缝结合的.高效的服务.我们依据Thrift的规范 简单定义访问接口,通过Thrift编译器编 ...

  3. spring MVC 统一异常处理(webapi和web分开处理)

    转载: http://blog.csdn.net/m13321169565/article/details/7641978 http://blog.csdn.net/ethan_fu/article/ ...

  4. linux(1):VMware虚拟软件下安装centos6.8

    前言:Linux是一种自由和开放源代码的类UNIX操作系统,继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统.本人学习Linux已经有一段时间了,从一开始的小白到现在的略有所悟 ...

  5. 使用alien命令让deb包和rpm包互相转换

    OS version: CentOS7 / Debian9 发现alien这个命令时很惊喜,之前在debian上安装etcd找不到安装包感觉很不科学,有了alien命令事情一下就变简单了. 这里以et ...

  6. 解题:九省联考2018 秘密袭击CoaT

    题面 按照*Miracle*的话来说,网上又多了一篇n^3暴力的题解 可能是因为很多猫题虽然很好,但是写正解性价比比较低? 直接做不可做,转化为统计贡献:$O(n)$枚举每个权值,直接统计第k大大于等 ...

  7. 8.30 牛客OI赛制测试赛1 F题 子序列

    题目描述 给出一个长度为n的序列,你需要计算出所有长度为k的子序列中,除最大最小数之外所有数的乘积相乘的结果 输入描述: 第一行一个整数T,表示数据组数.对于每组数据,第一行两个整数N,k,含义如题所 ...

  8. 【CH6201】走廊泼水节

    题目大意:给定一棵树,要求增加若干条边,将其转化为完全图,且该完全图以该树为唯一的最小生成树,求增加的边权最小是多少. 题解:完全图的问题一般要考虑组合计数.重新跑一遍克鲁斯卡尔算法,每次并查集在合并 ...

  9. activiti 用户手册中 10分钟 小例子 简单代码搭建 及 其中的 各种坑

    看mossle的 5.16 用户手册中的  快速起步:10分钟教程 想自己跑一下,虽然官方文档已经写的非常详细了,但是实际操作中还是遇到各种坑,这里记录下来. 首先官网下载最新的 5版本 full G ...

  10. 高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少

    高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少     阅读(81374) | 评论(9)收藏16 淘帖1 赞3   JackJiang Lv.9    1 年前 | 前言 曾几何时我 ...