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

Updated: 2022 / 9 / 5


Linux | crontab定时任务及开机自启

  • 安装
  • 查询
    • 开机自启项
      • 开机自启动
  • 设置
    • 开机自启项
    • crond
      • 语法
      • 区别
        • /etc/crontab
        • crontab
          • 工作原理
          • 格式
      • 命令
      • 任务
        • 示例
    • 开机自启动脚本
      • shell
        • shell脚本
          • 创建shell脚本
          • 配置crontab
          • 相关日志文件
        • shell命令
      • python
        • 创建py脚本
        • 配置crontab
        • 相关日志文件
  • 参考链接

安装

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

yum install vixie-cron
yum install crontabs

通过 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

参考这里 34

语法

crontab [-u username] [-l|-e|-r]
参数 含义
-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

对于 crontab -e,

#50 1 * * *  command

/etc/crontab

其文件内容格式如下:

$ cat /etc/crontabSHELL=/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 executed17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
参数 含义
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

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

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

如果你是系统管理员而且你的工作又是系统维护方面的例行任务时, 直接修改 /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 命令

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

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

特殊字符 代表意义
* 代表任何时刻都接受的意思。举例来说,日、月、周都是 * , 就代表着不论何月、何日的礼拜几的 12:00 都运行后续命令。
, 代表分隔时段的意思。举例来说,如果要下达的工作是 3:006:00 时,就会是 0 3,6 * * * command
时间参数还是有五栏,不过第二栏是 3,6,代表 36 都适用。
- 代表一段时间范围内,举例来说,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"   <==这是错误的写法

可能以为九月十一号且为星期五才会进行这项工作,无奈的是,系统可能会判定每个星期五作一次,或每年的 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.txtNote: This output shows SysV services only and does not include nativesystemd services. SysV configuration data might be overridden by nativesystemd configuration.If you want to list systemd services use 'systemctl list-unit-files'.To see services enabled on particular target use'systemctl list-dependencies [target]'.error reading information on service crond: No such file or directory
  • 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. 每两个小时
0 */2 * * * echo "Have a break now." >> /tmp/test.txt
  1. 晚上11点到早上8点之间每两个小时和早上八点
0 23-7/2,8 * * * echo "Have a good dream" >> /tmp/test.txt
  1. 每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3 command line
  1. 1月1日早上4点
0 4 1 1 * command line SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root
//如果出现错误,或者有数据输出,数据作为邮件发给这个帐号 HOME=/
  1. 每小时执行 /etc/cron.hourly 内的脚本
01 * * * * root run-parts /etc/cron.hourly
  1. 每天执行 /etc/cron.daily 内的脚本
02 4 * * * root run-parts /etc/cron.daily
  1. 每星期执行 /etc/cron.weekly 内的脚本
22 4 * * 0 root run-parts /etc/cron.weekly
  1. 每月去执行 /etc/cron.monthly 内的脚本
42 4 1 * * root run-parts /etc/cron.monthly
  1. 每天的下午 4 点、5 点、6 点的 5 min15 min25 min35 min45 min55 min 时执行命令。
5,15,25,35,45,55 16,17,18 * * * command
  1. 每周一,三,五的下午 3:00 系统进入维护状态,重新启动系统。
00 15 * * 1,3,5 shutdown -r +5
  1. 每小时的10分,40分执行用户目录下的 innd/bbslin 这个指令:
10,40 * * * * innd/bbslink
  1. 每小时的1分执行用户目录下的 bin/account 这个指令:
1 * * * * bin/account

开机自启动脚本

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

shell

shell脚本

创建shell脚本

以下面的内容为例,

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

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

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

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

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

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

shell命令

以下面的内容为例 5,

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

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

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

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

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

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

python

参考这里 26

创建py脚本

以下面的内容为例,

  1. 创建一个 test.py 脚本,放在 /home/Desktop 目录下,
$ touch /home/Desktop/test.py
  1. 编辑 test.py并写入下面的内容:
$ vim /home/Desktop/test.py
#!/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. 给该脚本可执行权限
$ chmod +x /home/Desktop/test.py
$ chmod 777 /home/Desktop/test.py

配置crontab

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

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

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

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

也可以加入日志选项,

*/2 * * * * /root/anaconda/bin/python /home/Desktop/test.py >> /home/Desktop/test.py.log 2>&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. 重启 crontab 服务
systemctl restart crond.service

相关日志文件

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

  • 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文件 ↩︎

Linux | crontab定时任务及开机自启项相关推荐

  1. Win10添加或删除开机自启项

    添加或关闭win10的开机自启项有以下两种常用方式: 1.  任务管理器 - 启动,然后选择要关闭或者启用的启动项,点击禁用或启用 2.  winkey + R,输入msconfig,回车,进入系统配 ...

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

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

  3. Linux crontab 定时任务命令详解

    Linux Crontab 定时任务 命令详解 [日期:2016-02-13] 来源:Linux社区 在工作中需要数据库在每天零点自动备份所以需要建立一个定时任务.我选择在Linux下使用Cronta ...

  4. Linux crontab定时任务配置方法(详解)

    id="BAIDU_DUP_fp_iframe" src="https://pos.baidu.com/wh/o.htm?ltr="> 脚本之家 服务器常 ...

  5. linux下crontab allow,【Python】Linux crontab定时任务配置方法(详解)

    CRONTAB概念/介绍html crontab命令用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于"crontab"文件中,以供以后读取和执行.linux ...

  6. linux 计划任务格式,linux crontab 定时任务格式和使用方法2019-01-13

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

  7. linux crontab 定时任务 计划任务 不执行 原因

    前言 最近在工作中遇到了一些问题,crontab定时任务居然不执行,后来我在网上找的时候发现网上主要说了这几个原因: 1 crond服务未启动 crontab不是Linux内核的功能,而是依赖一个cr ...

  8. Linux redis安装及开机自启详细教程

    总目录 一.redis简介 二.安装redis 三.配置redis 后台启动 开机自启 一.redis简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Ke ...

  9. Windows使用任务计划程序执行定时任务,开机自启任务,登录自启任务

    目录 打开控制面板 设置任务计划程序 第一种:创建基本任务 第二种:创建任务 修改/删除/查看任务 控制面板里面有很多实用的功能,我这里介绍一下怎么进入控制面板详细界面并配置任务计划程序 打开控制面板 ...

最新文章

  1. centos7 pam mysql.so,Centos7下搭建FTP服务器(博主亲测不坑)
  2. salt 基本组建之 grains,pillars(整理中)
  3. 【百度飞浆】目标检测综述
  4. Java是如何实现跨平台的?原理是什么?
  5. mds聚类matlab,MDS图示聚类结果
  6. 浅谈java中extends与implements的区别
  7. 用C#编写的代码经C#编译器后,并非生成本地代码而是生成托管代码
  8. 怎样恢复计算机管理员身份,电脑高手必备:2招教你找回Windows管理员权限?
  9. java 输出三位数和n位数的每一位的数
  10. Redis 数据结构的实现
  11. kubernetes API服务器的安全防护
  12. 2017/4/27 morning
  13. Introduction to Computer Networking学习笔记(二):字节顺序
  14. 数字证书驱动_网上申报中环CA数字证书更新流程(图解)
  15. java怎么打印反三角形_Java基础练习——打印正反三角形
  16. Win 10提升隐藏性能
  17. java包(java包和类)
  18. AT32F415 AT32F421 ERTC 时间戳的使用
  19. 经典:DotNetBar Suite UI 7.9 for WPF Crack
  20. 舞会 关灯 黑帽子 白帽子问题

热门文章

  1. 如何去掉a标签的下划线
  2. BI平台:怎么进行报表的开发和搭建
  3. Java:15位或18位居民身份证号码通用校验(正则表达式、日期格式、末尾校验码)
  4. 手把手教你搭建一个直播服务器(Nginx+Rtsp)
  5. pr导出视频在哪里?
  6. 北京奇云计算机技术学校,好的计算机编程学校
  7. 全志平台Android4.0 SOFTAP STATION共存调试记录1
  8. 国内硕士申请加拿大计算机博士难度,加拿大硕士申请博士容易吗?单单成绩优异是不够的...
  9. linux与Unix是什么关系?有什么区别?
  10. kindeditor html上传本地图片