Linux/Window之定时任务脚本编写(crontab/crond)

1 Windows 定时任务软件

Win 10

compmgmt.msc[Win+R] > 任务计划程序 > 任务计划程序库 > 创建基本任务

2 Linux 定时任务软件

实现linux定时任务主要可以通过cron、anacron、at三种,而使用最多的是cron任务。

CRON定时任务软件

概念

  1. [词义]cron一词来源于希腊语chronos(χρόνος),原意特指:时间。
  2. [功能]常见于Unix和类Unix的操作系统之中,通常被内置于操作系统中。用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。通常,crontab储存的指令被守护进程激活,crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。
  3. [Shell服务]cron服务提供cron、crontab命令(crontab,即 cron table之缩写)来设定cron服务。
  4. [推荐:绝对路径]脚本中推荐使用绝对路径,无论是shell脚本还是python脚本,里面所有的路径最好都是绝对路径!!!形如:echo "hello world" >> /root/jack/cron/sh-log.txt
  5. [辨析/核心命令]cron是服务名称,crond是后台进程,crontab则是定制好的计划任务表

cron的安装与服务管理

Ubuntu Linux

  • 检查Cronta工具是否安装
crontab -l
  • 安装与查看
shell> sudo apt-get install cron #安装,Ubuntu等Linux系统默认会按照cron服务
shell> sudo  service cron status # 查看cron状态
  • 服务管理
启动: service cron start
  或: /etc/init.d/cron start

重启: service cron restart
  或: /etc/init.d/cron restart

停止: service cron stop

运行状态: service cron status
查询cron可用的命令: service cron
  • 重新载入配置
# service cron reload
 * Reloading configuration files for periodic command scheduler cron

CENTOS Linux

【补充】CentOS安装/操纵crontab

  • 安装
yum -y install vixie-cron
yum -y install crontabs
  • 服务管理
systemctl start crond
systemctl stop crond
systemctl restart crond
systemctl reload crond
systemctl status crond

systemctl enable/disable crond.service (启用/禁用 开机运行)

crontab任务配置基本格式

crontab中的每一行代表一个定期执行的任务,分为6个部分。前5个部分表示何时执行命令,最后一个部分表示执行的shell命令。

edited file> # minute hour day-of-month month day-of-week commands
edited file>    *   *  *  *  *  command

其各项字段对应的合法值:00-59 00-23 01-31 01-12 0-6 (0 is sunday)

附加说明:操作符号 + 逗号(',')分开的值,例如:“1,3,4,7,8”。表示任意值,比如:在小时部分填写 * 代表任意小时(每小时) + 连词符('-')指定值的范围,例如:“1-6”,意思等同于“1,2,3,4,5,6”。可以允许在一个部分中填写多个值,比如:在分钟部分填写 1,3 表示一分钟或三分钟 + 星号('*')代表任何可能的值。形如,在“小时域”里的星号等于是“每一个小时”,等等。一般配合 * 使用,代表每隔多长时间,比如:在小时部分填写 */2 代表每隔两分钟。所以 */1 和 * 没有区别 */2 可以看成是能被2整除的任意值。

定时任务的使用与管理

创建定时任务

cmd shell> crontab -e
edited file> # minute hour day-of-month month day-of-week commands
edited file> */1 * * * * echo "Have a break now." >> /tmp/test.txt   # 每隔1分钟,执行bash shell命令"echo "Have a break now." >> /tmp/test.txt"
(注:管道符>>为在原文基础上追加,>为覆盖原文)
edited file> 3,15 * * * * command   # 每小时的第3和第15分钟执行command
edited file> 3,15 8-11 * * * command  # 在每天上午8点到11点的第3和第15分钟执行command
edited file> 6,10 * 2 * *  # 每个月2号,每小时的6分和10分执行一次任务
edited file> */3,*/5 * * * *   # 每隔3分钟或5分钟执行一次任务,比如10:03,10:05,10:06

[每1小时重启smb]

* */1 * * * /etc/init.d/smb restart

[从0点开始,每1小时重启smb]

* 0/1 * * * /etc/init.d/smb restart

[每天晚上的21:30重启apache]

30 21 * * * /usr/local/etc/rc.d/lighttpd restart

[每隔两天的上午8点到11点的第3和第15分钟执行]

3,15 8-11 */2  *  * myCommand

[每周一上午8点到11点的第3和第15分钟执行]

3,15 8-11 * * 1 myCommand

[每月1、10、22日的4 : 45重启smb]

45 4 1,10,22 * * /etc/init.d/smb restart

查看定时任务

  • crontab命令
    • -u //设定某用户的cron服务,一般root用户在执行这个命令的时候需要此参数
    • -l //显示某用户cron服务的配置信息 
    • -r //删除某用户的cron服务
    • -e //编辑某用户的cron服务的配置信息
    • -ir //删除 crontab 文件前提醒用户
crontab -u root -l  ## 用户(root)查看自己的cron服务配置信息
  • 查看指定用户的crontab任务
[root@sdc01 ~]# crontab -l -u root
0 */1 * * * command1
0 */2 * * * command2

查看定时任务的执行记录

  • 方法1

如下这两个命令都是在系统日志文件中搜索关键字 "CRON",并显示与其相关的日志信息

# grep CRON /var/log/syslog
# 或 grep CRON /var/log/cron

...
Apr 11 02:17:01 ecs-5c77 CRON[1765187]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 11 03:10:01 ecs-5c77 CRON[1798071]: (root) CMD (test -e /run/systemd/system || SERVICE_MODE=1 /sbin/e2scrub_all -A -r)
Apr 11 03:17:01 ecs-5c77 CRON[1801267]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 11 04:17:01 ecs-5c77 CRON[1828308]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 11 05:17:03 ecs-5c77 CRON[1851902]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 11 06:17:17 ecs-5c77 CRON[1880352]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 11 06:26:29 ecs-5c77 CRON[1885252]: (root) CMD (test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ))
Apr 11 07:17:02 ecs-5c77 CRON[1911725]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 11 08:17:02 ecs-5c77 CRON[1942188]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 11 09:17:01 ecs-5c77 CRON[1968671]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 11 10:17:02 ecs-5c77 CRON[1991671]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 11 11:17:01 ecs-5c77 CRON[2024276]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 11 12:17:01 ecs-5c77 CRON[2087639]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 11 13:17:01 ecs-5c77 CRON[2116618]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 11 14:17:01 ecs-5c77 CRON[2154427]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 11 15:17:01 ecs-5c77 CRON[2216767]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 11 16:17:01 ecs-5c77 CRON[2244407]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 11 17:17:01 ecs-5c77 CRON[2277587]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 11 18:17:01 ecs-5c77 CRON[2320813]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 11 19:17:01 ecs-5c77 CRON[2363367]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 11 20:17:01 ecs-5c77 CRON[2390437]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 11 21:17:01 ecs-5c77 CRON[2419541]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 11 22:17:01 ecs-5c77 CRON[2461569]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 11 23:17:01 ecs-5c77 CRON[2503064]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 12 00:17:02 ecs-5c77 CRON[2529092]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 12 01:17:01 ecs-5c77 CRON[2554586]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 12 02:17:01 ecs-5c77 CRON[2580003]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 12 03:10:01 ecs-5c77 CRON[2602473]: (root) CMD (test -e /run/systemd/system || SERVICE_MODE=1 /sbin/e2scrub_all -A -r)
Apr 12 03:17:01 ecs-5c77 CRON[2605449]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 12 04:17:01 ecs-5c77 CRON[2631381]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 12 05:17:01 ecs-5c77 CRON[2656810]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 12 06:17:01 ecs-5c77 CRON[2682270]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 12 06:25:01 ecs-5c77 CRON[2685714]: (root) CMD (test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ))
Apr 12 07:17:01 ecs-5c77 CRON[2707718]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 12 08:17:01 ecs-5c77 CRON[2733177]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 12 09:17:01 ecs-5c77 CRON[2759054]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 12 10:17:01 ecs-5c77 CRON[2786617]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 12 11:17:01 ecs-5c77 CRON[2821957]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 12 12:17:01 ecs-5c77 CRON[2879264]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 12 13:17:01 ecs-5c77 CRON[2913994]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 12 14:17:01 ecs-5c77 CRON[2951045]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 12 15:17:01 ecs-5c77 CRON[3020953]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 12 16:17:01 ecs-5c77 CRON[3058278]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 12 17:17:01 ecs-5c77 CRON[3091544]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 12 18:15:01 ecs-5c77 CRON[3134190]: (root) CMD (/root/bdp-xxl-job-executor-app.sh)
Apr 12 18:15:01 ecs-5c77 CRON[3134189]: (CRON) info (No MTA installed, discarding output)
Apr 12 18:17:01 ecs-5c77 CRON[3135649]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 12 18:20:01 ecs-5c77 CRON[3137877]: (root) CMD (/root/bdp-xxl-job-executor-app.sh)
Apr 12 18:20:01 ecs-5c77 CRON[3137876]: (CRON) info (No MTA installed, discarding output)
Apr 12 18:25:01 ecs-5c77 CRON[3141542]: (root) CMD (/root/bdp-xxl-job-executor-app.sh)
Apr 12 18:25:01 ecs-5c77 CRON[3141540]: (CRON) info (No MTA installed, discarding output)
Apr 12 18:26:49 ecs-5c77 cron[3142815]: (CRON) INFO (pidfile fd = 3)
Apr 12 18:26:49 ecs-5c77 cron[3142815]: (CRON) INFO (Skipping @reboot jobs -- not system startup)
Apr 12 18:30:01 ecs-5c77 CRON[3145218]: (root) CMD (/root/bdp-xxl-job-executor-app.sh)
Apr 12 18:30:01 ecs-5c77 CRON[3145216]: (CRON) info (No MTA installed, discarding output)
Apr 12 18:35:01 ecs-5c77 CRON[3148775]: (root) CMD (/root/bdp-xxl-job-executor-app.sh)
Apr 12 18:35:01 ecs-5c77 CRON[3148773]: (CRON) info (No MTA installed, discarding output)
Apr 12 18:40:01 ecs-5c77 CRON[3152376]: (root) CMD (/root/bdp-xxl-job-executor-app.sh)
Apr 12 18:40:01 ecs-5c77 CRON[3152374]: (CRON) info (No MTA installed, discarding output)
Apr 12 18:45:01 ecs-5c77 CRON[3156198]: (root) CMD (/root/bdp-xxl-job-executor-app.sh)
Apr 12 18:45:01 ecs-5c77 CRON[3156196]: (CRON) info (No MTA installed, discarding output)
...

此外,也可以使用 "tail -f /var/log/syslog" 或 "tail -f /var/log/cron" 来实时查看日志,可以看到cron的执行过程。

修改编辑器

  • crontab默认/推荐的编辑器是nano,对于用惯了vim编辑器的同志们来说,这个nano就实在用着别扭。别慌,可以通过如下方式修改编辑器。

  • 如果您的系统上没有安装选择编辑器,则可以改用 Linux 上的 EDITOR 环境变量。EDITOR 变量指定系统在 crontab 运行时应调用的文本编辑器的路径。
  • 要设置 EDITOR 变量,请使用以下命令:
export EDITOR=/path/to/editor
  • 将 nano 设置为默认文本编辑器
export EDITOR=/usr/bin/nano

您还可以在 shell 配置文件中设置 EDITOR 变量,例如 ~/.bashrc~/.bash_profile,以使更改化。例如,要使 nano 成为您的默认编辑器,请将以下行添加到您的 ~/.bashrc~/.zshrc 文件中,具体取决于您使用的 shell:

要在不注销的情况下应用更改,请运行以下命令:

source ~/.bashrc
  • 将 vim 设置为默认编辑器

vim /etc/profile

# 设置CRONTAB的编辑器
export EDITOR=/usr/bin/vim.basic

或 
export EDITOR=/usr/bin/vim.tiny

同理,需要使环境变量生效:

source /etc/profile

这样,你再编辑定时任务(crontab -e)时,用的就是vim编辑器了

X 参考文献

posted @ 2019-04-21 20:24  千千寰宇  阅读(3133)  评论(0编辑  收藏  举报