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. Android dimen

    转自:Android:dimen尺寸资源文件的使用 dimen.xml在values文件夹下面 <resources> <!-- Default screen margins, pe ...

  2. Python的文件读写

    目录 读文件 操作文件 读取内容 面试题的例子 写文件 操作模式 指针操作 字符编码 读文件 操作文件 打开一个文件用open()方法(open()返回一个文件对象,它是可迭代的): 文件使用完毕后必 ...

  3. 窗体的构造函数和OnCreate事件

    窗体的构造函数和创建事件和OldCreateOrder属性有很大的关系. 情况1: 如果窗体继承自TForm,且有如下形式: 1.      constructor TForm1.Create(AOw ...

  4. bzoj 3531 [Sdoi2014]旅行 (树剖+线段树 动态开点)

    3531: [Sdoi2014]旅行 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 2984  Solved: 1312[Submit][Status ...

  5. 【洛谷P4955 】[USACO14JAN]越野滑雪越野滑雪

    题目链接:ヾ(≧∇≦*)ゝ 对于每一个点可以向它右边的点和下面的点连边,权值就为两个点的高度差 然后再把所有的边按边权从小到大排序,并查集加点 最后判断当前集合是否涵盖所有的航点,如果是,就输出最后一 ...

  6. 【刷题】BZOJ 4316 小C的独立集

    Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. 这不,小C让小D去求一个无向图的最大独立集,通俗地讲就是:在无向图中选出若干个点,这些点互相没有边连接,并使 ...

  7. 解题:SCOI 2007 蜥蜴

    题面 拆点跑最大流 所有能跑出去的点连向汇点,容量为inf 原点连向所有初始有蜥蜴的点,容量为1 每根柱子拆成两个点“入口”和“出口”,入口向出口连容量为高度的边,出口向别的有高度的柱子的入口连容量为 ...

  8. Python(3)---从迭代器到异步IO

    whenif 关注 2017.02.13 23:48* 字数 1750 阅读 250评论 0喜欢 8 目录 1. 迭代(iteration)与迭代器(iterator) 1.1 构建简单迭代器 1.2 ...

  9. jdk1.8中获取项目绝对路径和项目路径

    request.getSession().getServletContext().getRealPath("")  获取项目的绝对路径,含着项目的名称. request.getSe ...

  10. SQL记录-PLSQL循环

    PL/SQL循环   可能有一种情况,当需要执行的代码块的几个多次.在一般情况下,语句顺序执行:一个函数的第一条语句,首先执行,然后是第二个...等等. 编程语言提供了各种控制结构,允许更多复杂的执行 ...