本文总结如何使用 crontab 创建定时任务及开启自启项 1。
本文基于 CentOS 7.9 系统所写。

Updated: 2022 / 9 / 5



安装

此处给出在线安装的步骤 2,如果服务器没网则自行下载 crontab 离线包,传到服务器离线安装。

yum install vixie-cron
yum install crontabs
  • 1
  • 2

通过 rpm -qa | grep crontab 检查是否已安装好。

安装完成后,可以进入到服务器 /etc 目录 cd /etc。


查询

开机自启项

  • systemctl list-unit-files
    查询开机自启项,左边是服务名称,右边是状态(enabled 是开机启动,disabled 是开机不启动),如下图所示:

开机自启动

  • systemctl list-unit-files | grep enabled
    查询开机自启动服务,左边是服务名称,右边是状态 enabled

设置

开机自启项

以 redis 为例,

  • systemctl enable redis

crond

参考这里 3’ 4

语法

crontab [-u username] [-l|-e|-r]
  • 1
参数 含义
-u 只有 root 才能进行这个任务,亦即帮其他使用者创建/移除 crontab 工作排程;
-e 编辑 crontab 的工作内容
-l 查阅 crontab 的工作内容
比如, crontab -l
-r 移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑
比如,crontab -r

区别

  1. 使用范围
    修改 /etc/crontab 这种方法只有 root 用户能用,这种方法更加方便与直接直接给其他用户设置计划任务,而且还可以指定执行 shell 等等,属于系统的周期任务。

    crontab -e 这种所有用户都可以使用,普通用户也只能为自己设置计划任务。然后自动写入 /var/spool/cron/usename, 比如说 root 用户使用 crontab -e 则计划任务被写入 /var/spool/cron/root,属于某个用户的周期计划任务。

  2. 相关文件
    crontab -e 这个 crontab 其实是 /usr/bin/crontab 这个执行文件,但是 /etc/crontab 是个纯文本文件, 可以以 root 的身份编辑这个文件。

  3. 格式
    对于 /etc/crontab, 多一个 user-name 指定:

# For details see man 4 crontabs

# Example of job definition:

# .---------------- minute (0 - 59)

# | .------------- hour (0 - 23)

# | | .---------- day of month (1 - 31)

# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...

# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat

# | | | | |

# * * * * * user-name command to be executed
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

对于 crontab -e,

#50 1 * * *  command
  • 1

/etc/crontab

其文件内容格式如下:

$ cat /etc/crontab

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root # For details see man 4 crontabs # Example of job definition:

# .---------------- minute (0 - 59)

# | .------------- hour (0 - 23)

# | | .---------- day of month (1 - 31)

# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...

# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat

# | | | | |

# * * * * * user-name command to be executed

17 * * * * root cd / && run-parts --report /etc/cron.hourly
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
参数 含义
SHELL=/bin/bash 指定系统使用的 SHELL 环境,比如 /bin/bash。
PATH=.... 定义执行命令的路径。
MAILTO=root MAILTO 这个字段说明了当 /etc/crontab 文件中的例行性命令发生错误时,会将错误信息或屏幕显示的信息传递给 MAILTO 变量定义的用户名。由于 root 无法在客户端收信,因此,可以将这个 email 改成自己普通用户帐号。如果 MAILTO 变量定义为空字符串,则错误信息将不会被发送。

以 01 * * * * root nice -n 19 run-parts /etc/cron.hourly 为例进行说明,在#run-parts 这一行以后的命令,我们可以发现,5个数字后面接的是 root,这代表执行的层级为 root 身份。当然,您也可以把 root 改成其他身份,而 run-parts 表示后面接的是 /etc/cron.hourly 是一个目录内(/etc/cron.hourly) 的所有可执行文件。也就是说每个小时的 01 分,系统会以 root 的身份到 /etc/cron.hourly 目录下执行所有可以执行的文件。系统本来就默认了这4个目录,您可以将每天需要执行的命令直接写到 /etc/cron.daily 中,还不需要用到 crontab -e 程序,很方便。

基本上,/etc/crontab 支持两种输入指令的方式,一种是直接以指令形式输入,一种则是以目录形式输入。

输入形式 示例
指令形式 01 * * * * test mail -s test test < /home/test/test/test.txt
用户是 test,且每小时执行一次指令 mail……
目录形式 */5 * * * * root run-parts /root/runcron
建立一个 /root/runcron 目录,将每隔 5 分钟执行一次的可执行文件都写到该目录下,就可以让系统每5分钟执行一次该目录下的所有可执行文件。

这个 /etc/crontab 里面预配置义出四项工作任务,分别是每小时、每天、每周及每个月分别进行一次的工作。但是在五个栏位后面接的并不是命令,而是一个新的栏位,那就是运行后面那串命令的身份 user-name,比如 root。
为何? 这与使用者的 crontab -e 不相同。由于使用者自己的 crontab 并不需要指定身份,但 /etc/crontab 里面当然要指定身份。以上表的内容来说,系统默认的例行性工作是以 root 的身份来进行的。

那么后面那串命令 command to be executed 是什么呢?你可以使用 which run-parts 搜寻看看,其实那是一个 bash script。如果你直接进入 /usr/bin/run-parts 去看看, 会发现这支命令会将后面接的目录内的所有文件捉出来运行。这也就是说,如果你想让系统每小时主动帮你运行某个命令,将该命令写成 script,并将该文件放置到 /etc/cron.hourly/ 目录下即可的意思。

假设你现在要作一个目录,让系统可以每 2 分钟去运行这个目录下的所有可以运行的文件,你可以写下如下的这一行在 /etc/crontab 中:

*/2 * * * * root run-parts /etc/cron.min
  • 1

当然,/etc/cron.min 这个目录是需要存在的。那如果我需要运行的是一个 程序 而已, 不需要用到一个目录,该如何是好?例如在侦测网络流量时,我们希望每五分钟侦测分析一次, 可以这样写:

*/5 * * * * root /bin/mrtg /etc/mrtg/mrtg.cfg
  • 1

如果你是系统管理员而且你的工作又是系统维护方面的例行任务时, 直接修改 /etc/crontab 这个文件即可。

crond 服务的最低侦测限制是 分钟,所以 cron 会每分钟去读取一次 /etc/crontab 与 /var/spool/cron 里面的数据内容,因此,只要你编辑完 /etc/crontab 这个文件,并且将他储存之后,那么 cron 的配置就自动的会来运行了。

备注:在 Linux 底下的 crontab 会自动的帮我们每分钟重新读取一次 /etc/crontab 的例行工作事项,但是某些原因或者是其他的 Unix 系统中,由于 crontab 是读到内存当中的,所以在你修改完 /etc/crontab 之后,可能并不会马上运行, 这个时候请重新启动 crond 服务。

crontab

工作原理

当使用者使用 crontab 这个命令来创建工作排程之后,该项工作就会被纪录到 /var/spool/cron/ 里面去了,而且是以帐号来作为判别的。
举例来说, blue 使用 crontab 后, 他的工作会被纪录到 /var/spool/cron/blue 里头去。可以使用 cat /var/spool/cron/blue 查看当前任务列表。

但请注意,不要使用 vi 直接编辑该文件, 因为可能由于输入语法错误,会导致无法运行 cron。

crontab 会进行语法检查,vi 不会

另外, cron 运行的每一项工作都会被纪录到 /var/log/cron 这个登录档中,所以,如果你的 Linux 不知道有否被植入木马时,也可以搜寻一下 /var/log/cron 这个登录档。

格式

crontab 的格式讲解,每项工作 (每行) 的格式都是具有六个栏位,这六个栏位的意义为:

代表意义 分钟 小时 日期 月份 周 命令
数字范围 0-59 0-23 1-31 1-12 0-7 命令

周的数字为 0 或 7 时,都代表 星期天 的意思。

另外, 还有一些辅助的字符,大概有底下这些:

特殊字符 代表意义
* 代表任何时刻都接受的意思。举例来说,日、月、周都是 * , 就代表着不论何月、何日的礼拜几的 12:00 都运行后续命令。
, 代表分隔时段的意思。举例来说,如果要下达的工作是 3:00 与 6:00 时,就会是 0 3,6 * * * command
时间参数还是有五栏,不过第二栏是 3,6,代表 3 与 6 都适用。
- 代表一段时间范围内,举例来说,8 点到 12 点之间的每小时的 20 分都进行一项工作:20 8-12 * * * command。仔细看到第二栏变成 8-12,代表 8,9,10,11,12 都适用
/n 那个 n 代表数字,亦即是每隔 n 单位间隔的意思,例如每五分钟进行一次,则*/5 * * * * command。
用 * 与 /5 来搭配,也可以写成 0-59/5

另一个需要注意的地方在于,你可以分别以 周 或者是 日月 为单位作为循环,但你不可使用 几月几号且为星期几 的模式工作。 这个意思是说,你不可以这样编写一个工作排程:

30 12 11 9 5 root echo "just test"   <==这是错误的写法
  • 1

可能以为九月十一号且为星期五才会进行这项工作,无奈的是,系统可能会判定每个星期五作一次,或每年的 9 月 11 号分别进行,如此一来与你当初的规划就不一样了。所以,得要注意这个地方!上述的写法是不对的。

命令

  • service crond start
    systemctl start crond.service
    启动服务
  • service crond stop
    关闭服务
  • service crond restart
    systemctl stop crond.service
    重启服务
  • service crond reload
    重新载入配置
  • service crond status
    查看 crond 服务的状态
  • chkconfig crond on
    设置开机自动启动crond服务
  • chkconfig –list crond
    开机级别的crond服务运行情况 ,2、3、4、5级别开机会自动启动 crond 服务
    当然,也有可能不起作用,如下所示:
$ chkconfig --list crond > /home/Desktop/fxk.txt

Note: This output shows SysV services only and does not include native

systemd services. SysV configuration data might be overridden by native

systemd configuration.
  If you want to list systemd services use <span class="token string">'systemctl list-unit-files'</span><span class="token builtin class-name">.</span>
To see services enabled on particular target use
<span class="token string">'systemctl list-dependencies [target]'</span><span class="token builtin class-name">.</span>

error reading information on service crond: No such file or directory

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • chkconfig --level 345 crond on
    设置开机启动
  • chkconfig crond off
    取消开机自动启动 crond 服务:
  • crontab -e
    配置是针对某个用户的,而编辑 /etc/crontab 是针对系统的任务
  • crontab -l
    列出当前的所有调度任务
  • crontab -l -u root
    列出用户 root 的所有调度任务
  • crontab -r
    删除所有任务调度工作

任务

示例

以下面的例子说明 crontab 的任务该如何编辑:

  1. 每天早上6点
0 6 * * * echo "Good morning." >> /tmp/test.txt
//注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。
  • 1
  • 2
  1. 每两个小时
0 */2 * * * echo "Have a break now." >> /tmp/test.txt  
  • 1
  1. 晚上11点到早上8点之间每两个小时和早上八点
0 23-7/2,8 * * * echo "Have a good dream" >> /tmp/test.txt
  • 1
  1. 每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3 command line
  • 1
  1. 1月1日早上4点
0 4 1 1 * command line SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root
//如果出现错误,或者有数据输出,数据作为邮件发给这个帐号 HOME=/
  • 1
  • 2
  1. 每小时执行 /etc/cron.hourly 内的脚本
01 * * * * root run-parts /etc/cron.hourly
  • 1
  1. 每天执行 /etc/cron.daily 内的脚本
02 4 * * * root run-parts /etc/cron.daily 
  • 1
  1. 每星期执行 /etc/cron.weekly 内的脚本
22 4 * * 0 root run-parts /etc/cron.weekly 
  • 1
  1. 每月去执行 /etc/cron.monthly 内的脚本
42 4 1 * * root run-parts /etc/cron.monthly 
  • 1
  1. 每天的下午 4 点、5 点、6 点的 5 min、15 min、25 min、35 min、45 min、55 min 时执行命令。
5,15,25,35,45,55 16,17,18 * * * command
  • 1
  1. 每周一,三,五的下午 3:00 系统进入维护状态,重新启动系统。
00 15 * * 1,3,5 shutdown -r +5
  • 1
  1. 每小时的10分,40分执行用户目录下的 innd/bbslin 这个指令:
10,40 * * * * innd/bbslink 
  • 1
  1. 每小时的1分执行用户目录下的 bin/account 这个指令:
1 * * * * bin/account
  • 1

开机自启动脚本

逻辑分为以下三点:
① 建立一个可执行文件 (权限要求自己定义,有权限执行就行);
② vim /etc/crontab 或者 crontab -e 编辑定时程序;
③ 程序会根据定时代码定时执行程序;

shell

shell脚本

创建shell脚本

以下面的内容为例,

  1. 创建一个 test.sh 脚本,放在 /home/Desktop 目录下,
$ touch /home/Desktop/test.sh
  • 1
  1. 编辑 test.sh并写入下面的内容:
$ vim /home/Desktop/test.sh
  • 1
#!/bin/bash
echo "123" >> /home/Desktop/test.txt
  • 1
  • 2
  1. 给该脚本可执行权限

$ chmod +x /home/Desktop/test.sh
$ chmod 777 /home/Desktop/test.sh
  • 1
  • 2
  • 3
配置crontab
  1. 编辑 crontab 入如下所示的内容:
$ crontab -e
  • 1
* * * * * root sh /home/Desktop/test.sh
  • 1

root 表示执行用户,sh /home/Desktop/test.sh 是定时程序执行的指令

  1. 重新加载定时程序,
service crond reload
  • 1
  1. 重启 crontab 服务
systemctl restart crond.service
  • 1
相关日志文件

其他运行中需要关注的操作:

  • tail /var/log/cron
    查看 crontab 日志

shell命令

以下面的内容为例 5,

  1. 在 crontab 中写了如下的一个任务:
* * * * * echo "hello world"
  • 1

注意单纯 echo,从屏幕上看不到任何输出,因为 cron 把任何输出都 email 到 root 的信箱了。可以把这个输出重定向到另外一个标准输出文件中,比如说重定向输出到一个 txt 文件中,

* * * * * echo "hello world" >> /tmp/test.txt 
  • 1

若执行有效通过 ls -l 可以看到 test.txt 文件的时间发生变化,cat test.txt 后 hello world 写入

  1. 以格式化时间命名文件
* * * * * cp /tmp/test.txt /tmp/$(date %Y-%m-%d %H:%M:%S)
  • 1

可以看见每分钟被创建的以当前时间命名的文件

python

参考这里 2’ 6

创建py脚本

以下面的内容为例,

  1. 创建一个 test.py 脚本,放在 /home/Desktop 目录下,
$ touch /home/Desktop/test.py
  • 1
  1. 编辑 test.py并写入下面的内容:
$ vim /home/Desktop/test.py
  • 1
#!/usr/bin/python
#encoding=utf-8
import os
outfileName = '~/outcid.txt'
outfile = open(outfileName, 'w')
outfile.write("This is crontab command test!") outfile.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  1. 给该脚本可执行权限
$ chmod +x /home/Desktop/test.py
$ chmod 777 /home/Desktop/test.py
  • 1
  • 2

配置crontab

  1. 编辑 crontab 入如下所示的内容:
$ crontab -e
  • 1
*/2 * * * * python /home/Desktop/test.py
  • 1

root 表示执行用户,sh /home/Desktop/test.sh 是定时程序执行的指令

当然,也可以写 python 的绝对路径,

*/2 * * * * /root/anaconda/bin/python /home/Desktop/test.py
  • 1

也可以加入日志选项,

*/2 * * * * /root/anaconda/bin/python /home/Desktop/test.py >> /home/Desktop/test.py.log 2>&1 &
  • 1

意思是每个 2 分钟就用 /root/anaconda/python 执行 /home/Desktop 目录下的 test.py,将日志输出值test.py.log 中,当然,程序 test.py 中的输入到指定文件的数据是不会输入到该 log 文件中的,后面那个2>&1 的意思是把错误的输出也输出到标准输出(2 表示错误,2> 表示错误输出,& 表示等同于,1 表示正确),因此如果运行出错也会把错误输出到之前定义的 log 中。最后的 & 表示后台运行。

2.重新加载定时程序,

service crond reload
  • 1
  1. 重启 crontab 服务
systemctl restart crond.service
  • 1

相关日志文件

其他运行中需要关注的操作:

  • tail /var/log/cron
    查看 crontab 日志
  • tail /home/Desktop/test.py.log
    more /home/Desktop/test.py.log
    查看 python 运行日志

参考链接


  1. centos7 设置 查看 开机 启动项(自启项) ︎

  2. crontab定时启动python脚本 ︎ ︎

  3. 设置crontab定时器及开启自启 ︎

  4. linux定时任务no crontab for root 解答 ︎

  5. linux 检测crontab ︎

  6. crontab定时执行python文件 ︎

文章知识点与官方知识档案匹配,可进一步学习相关知识
云原生入门技能树首页概览13594 人正在系统学习中

[转帖]Linux | crontab定时任务及开机自启项的更多相关文章

  1. 【Python】Linux crontab定时任务配置方法(详解)

    CRONTAB概念/介绍 crontab命令用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行. cron 系统调度进程. 可以使用它在 ...

  2. ElasticSearch(十四):Linux下设置ElasticSearch 开机自启

    一.创建脚本文件 在  /etc/init.d  目录下,创建脚本文件 elasticsearch # cd /etc/init.d/ # vim elasticsearch 将以下内容写入文件中(其 ...

  3. Linux crontab 定时任务

    http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/crontab.html 19. crontab 定时任务 通过crontab 命令,我们 ...

  4. linux crontab 定时任务解析

    -----------crontab定时任务---------------------- 检查crontab工具是否安装 crontab -l 检查crontab服务是否启动 service cron ...

  5. [转帖]Linux crontab 查看所有用户的crontab任务

    Linux crontab 查看所有用户的crontab任务 https://www.cnblogs.com/xzlive/p/11542176.html 查看所有用户的crontab任务 - mlz ...

  6. Linux下设置Nginx开机自启

    1.本地环境 [root@dev ~]#cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) 2.在/etc/init.d创建ngi ...

  7. Linux 7开机自启项查看并设置

      在Linux6中查看及设置开机自启信息是使用chkconfig命令,Linux7中此命令已经被替代,接下来我们就来研究下Linux7中的区别所在. chkconfig --list Note: T ...

  8. linux 上设置mysql开机自启

    此方式是通过安装包安装的,如果是yum安装的rpm包,可参考yum安装MySQL8.0 三个月之前安装的mysql,记得是设置了开机自启,但是今天再次进入的时候发现,无法登录,报错如下 原因是mysq ...

  9. Fedora增加rc-local服务开机自启项

      最近新装了一台Fedora 30系统,服务已经正常运行起来了,但是偶然发现当我的系统重启后,写在rc.local配置文件里的命令居然没生效,导致我系统重启,但是服务却没有正常运行,后来经过一番查阅 ...

  10. linux crontab定时任务调用CI框架PHP代码

    *****监控项目中使用*****: sudo crontab -u wangyan -e i 5,25,45 * * * * wget http://xxx.xxx.com/xxx/xx Esc : ...

随机推荐

  1. 23、Flutter AppBar TabBar TabBarView

    AppBar自定义顶部按钮图标.颜色 class MyHomePage extends StatelessWidget { const MyHomePage({super.key}); @overri ...

  2. 一文带你熟悉Pytorch->Caffe->om模型转换流程

    摘要:本文旨在分享Pytorch->Caffe->om模型转换流程. 标准网络 Baseline:PytorchToCaffe 主要功能代码在: PytorchToCaffe +-- Ca ...

  3. GaussDB(for Redis)揭秘:Redis存算分离架构最全解析

    前言: 本文根据华为云NoSQL数据库架构师余汶龙,在今年的中国系统架构师大会SACC上的演讲整理而成,内容如下. 本次分享的大纲分成如下四个部分: 什么是GaussDB(for Redis)? 为什 ...

  4. 谁说count(*) 性能最差,我需要跟你聊聊

    摘要:当我们对一张数据表中的记录进行统计的时候,习惯都会使用 count 函数来统计,但是 count 函数传入的参数有很多种,比如 count(1).count(*).count(字段) 等.到底哪 ...

  5. 开心档之C++ 数据结构

    C++ 数据结构 C/C++ 数组允许定义可存储相同类型数据项的变量,但是结构是 C++ 中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项. 结构用于表示一条记录,假设您想要跟踪图书馆 ...

  6. 白话 Pulsar Bookkeeper 的存储模型

    最近我们的 Pulsar 存储有很长一段时间数据一直得不到回收,但消息确实已经是 ACK 了,理论上应该是会被回收的,随着时间流逝不但没回收还一直再涨,最后在没找到原因的情况下就只有一直不停的扩容. ...

  7. SpringBoot 项目实战 | 瑞吉外卖 Day01

    一.软件开发整体介绍 1.软件开发流程 2.角色分工 项目经理:对整个项目负责,任务分配.把控进度 产品经理:进行需求调研,输出需求调研文档.产品原型等 UI设计师:根据产品原型输出界面效果图 架构师 ...

  8. 汇编 | mov. add. sub指令

    Description 前面我们用到了mov, add. sub指令,它们都带有两个操作对象.到现在,我们知道,mov指令可以有以下几种形式. mov 寄存器,数据 比如: mov ax,8 mov ...

  9. [网络克隆]利用tiny proxy实现局域网内批量安装WINDOWS操作系统。

    说明:本文支持UEFI及BIOS系统克隆.支持UEFI及BIOS网络引导,适用于新旧几乎所有支持网络启动的电脑. 事前准备: 保证被克隆的电脑为同一配置,或者各硬件差异不大,比如CPU同如英特尔8代的 ...

  10. 阿里云 Serverless Kubernetes 的落地实践分享

    作者 | 元毅(阿里云容器平台高级开发工程师) ​ 微信搜索关注 Serverless 公众号,后台回复 深圳 可获取本文 PPT 导读** Kubernetes 作为当今云原生业界标准,具备良好的生 ...