Linux
本文总结如何使用 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
参考这里 3’ 4
语法
crontab [-u username] [-l|-e|-r]
参数 | 含义 |
---|---|
-u | 只有 root 才能进行这个任务,亦即帮其他使用者创建/移除 crontab 工作排程; |
-e | 编辑 crontab 的工作内容 |
-l | 查阅 crontab 的工作内容比如, crontab -l |
-r | 移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑比如, crontab -r |
区别
-
使用范围
修改/etc/crontab
这种方法只有root
用户能用,这种方法更加方便与直接直接给其他用户设置计划任务,而且还可以指定执行shell
等等,属于系统的周期任务。
crontab -e
这种所有用户都可以使用,普通用户也只能为自己设置计划任务。然后自动写入/var/spool/cron/usename
, 比如说root
用户使用crontab -e
则计划任务被写入/var/spool/cron/root
,属于某个用户的周期计划任务。 -
相关文件
crontab -e
这个crontab
其实是/usr/bin/crontab
这个执行文件,但是/etc/crontab
是个纯文本文件, 可以以root
的身份编辑这个文件。 -
格式
对于/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 | 命令 |
周的数字为 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" <==这是错误的写法
可能以为九月十一号且为星期五才会进行这项工作,无奈的是,系统可能会判定每个星期五作一次,或每年的 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
的任务该如何编辑:
- 每天早上6点
0 6 * * * echo "Good morning." >> /tmp/test.txt
//注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。
- 每两个小时
0 */2 * * * echo "Have a break now." >> /tmp/test.txt
- 晚上11点到早上8点之间每两个小时和早上八点
0 23-7/2,8 * * * echo "Have a good dream" >> /tmp/test.txt
- 每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3 command line
- 1月1日早上4点
0 4 1 1 * command line SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root
//如果出现错误,或者有数据输出,数据作为邮件发给这个帐号 HOME=/
- 每小时执行
/etc/cron.hourly
内的脚本
01 * * * * root run-parts /etc/cron.hourly
- 每天执行
/etc/cron.daily
内的脚本
02 4 * * * root run-parts /etc/cron.daily
- 每星期执行
/etc/cron.weekly
内的脚本
22 4 * * 0 root run-parts /etc/cron.weekly
- 每月去执行
/etc/cron.monthly
内的脚本
42 4 1 * * root run-parts /etc/cron.monthly
- 每天的下午
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
- 每周一,三,五的下午
3:00
系统进入维护状态,重新启动系统。
00 15 * * 1,3,5 shutdown -r +5
- 每小时的10分,40分执行用户目录下的
innd/bbslin
这个指令:
10,40 * * * * innd/bbslink
- 每小时的1分执行用户目录下的
bin/account
这个指令:
1 * * * * bin/account
开机自启动脚本
逻辑分为以下三点:
① 建立一个可执行文件 (权限要求自己定义,有权限执行就行);
② vim /etc/crontab
或者 crontab -e
编辑定时程序;
③ 程序会根据定时代码定时执行程序;
shell
shell脚本
创建shell脚本
以下面的内容为例,
- 创建一个
test.sh
脚本,放在/home/Desktop
目录下,
$ touch /home/Desktop/test.sh
- 编辑
test.sh
并写入下面的内容:
$ vim /home/Desktop/test.sh
#!/bin/bash
echo "123" >> /home/Desktop/test.txt
- 给该脚本可执行权限
$ chmod +x /home/Desktop/test.sh
$ chmod 777 /home/Desktop/test.sh
配置crontab
- 编辑
crontab
入如下所示的内容:
$ crontab -e
* * * * * root sh /home/Desktop/test.sh
root
表示执行用户,sh /home/Desktop/test.sh
是定时程序执行的指令
- 重新加载定时程序,
service crond reload
- 重启
crontab
服务
systemctl restart crond.service
相关日志文件
其他运行中需要关注的操作:
-
tail /var/log/cron
查看crontab
日志
shell命令
以下面的内容为例 5,
- 在
crontab
中写了如下的一个任务:
* * * * * echo "hello world"
注意单纯 echo
,从屏幕上看不到任何输出,因为 cron
把任何输出都 email
到 root
的信箱了。可以把这个输出重定向到另外一个标准输出文件中,比如说重定向输出到一个 txt
文件中,
* * * * * echo "hello world" >> /tmp/test.txt
若执行有效通过 ls -l
可以看到 test.txt
文件的时间发生变化,cat test.txt
后 hello world
写入
- 以格式化时间命名文件
* * * * * cp /tmp/test.txt /tmp/$(date %Y-%m-%d %H:%M:%S)
可以看见每分钟被创建的以当前时间命名的文件
python
参考这里 2’ 6
创建py脚本
以下面的内容为例,
- 创建一个
test.py
脚本,放在/home/Desktop
目录下,
$ touch /home/Desktop/test.py
- 编辑
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()
- 给该脚本可执行权限
$ chmod +x /home/Desktop/test.py
$ chmod 777 /home/Desktop/test.py
配置crontab
- 编辑
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
- 重启
crontab
服务
systemctl restart crond.service
相关日志文件
其他运行中需要关注的操作:
-
tail /var/log/cron
查看crontab
日志 -
tail /home/Desktop/test.py.log
more /home/Desktop/test.py.log
查看python
运行日志
参考链接
centos7 设置 查看 开机 启动项(自启项) ↩︎
crontab定时启动python脚本 ↩︎ ↩︎
设置crontab定时器及开启自启 ↩︎
linux定时任务no crontab for root 解答 ↩︎
linux 检测crontab ↩︎
crontab定时执行python文件 ↩︎
Linux
本文总结如何使用 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
参考这里 3’ 4
语法
crontab [-u username] [-l|-e|-r]
参数 | 含义 |
---|---|
-u | 只有 root 才能进行这个任务,亦即帮其他使用者创建/移除 crontab 工作排程; |
-e | 编辑 crontab 的工作内容 |
-l | 查阅 crontab 的工作内容比如, crontab -l |
-r | 移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑比如, crontab -r |
区别
-
使用范围
修改/etc/crontab
这种方法只有root
用户能用,这种方法更加方便与直接直接给其他用户设置计划任务,而且还可以指定执行shell
等等,属于系统的周期任务。
crontab -e
这种所有用户都可以使用,普通用户也只能为自己设置计划任务。然后自动写入/var/spool/cron/usename
, 比如说root
用户使用crontab -e
则计划任务被写入/var/spool/cron/root
,属于某个用户的周期计划任务。 -
相关文件
crontab -e
这个crontab
其实是/usr/bin/crontab
这个执行文件,但是/etc/crontab
是个纯文本文件, 可以以root
的身份编辑这个文件。 -
格式
对于/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 | 命令 |
周的数字为 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" <==这是错误的写法
可能以为九月十一号且为星期五才会进行这项工作,无奈的是,系统可能会判定每个星期五作一次,或每年的 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
的任务该如何编辑:
- 每天早上6点
0 6 * * * echo "Good morning." >> /tmp/test.txt
//注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。
- 每两个小时
0 */2 * * * echo "Have a break now." >> /tmp/test.txt
- 晚上11点到早上8点之间每两个小时和早上八点
0 23-7/2,8 * * * echo "Have a good dream" >> /tmp/test.txt
- 每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3 command line
- 1月1日早上4点
0 4 1 1 * command line SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root
//如果出现错误,或者有数据输出,数据作为邮件发给这个帐号 HOME=/
- 每小时执行
/etc/cron.hourly
内的脚本
01 * * * * root run-parts /etc/cron.hourly
- 每天执行
/etc/cron.daily
内的脚本
02 4 * * * root run-parts /etc/cron.daily
- 每星期执行
/etc/cron.weekly
内的脚本
22 4 * * 0 root run-parts /etc/cron.weekly
- 每月去执行
/etc/cron.monthly
内的脚本
42 4 1 * * root run-parts /etc/cron.monthly
- 每天的下午
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
- 每周一,三,五的下午
3:00
系统进入维护状态,重新启动系统。
00 15 * * 1,3,5 shutdown -r +5
- 每小时的10分,40分执行用户目录下的
innd/bbslin
这个指令:
10,40 * * * * innd/bbslink
- 每小时的1分执行用户目录下的
bin/account
这个指令:
1 * * * * bin/account
开机自启动脚本
逻辑分为以下三点:
① 建立一个可执行文件 (权限要求自己定义,有权限执行就行);
② vim /etc/crontab
或者 crontab -e
编辑定时程序;
③ 程序会根据定时代码定时执行程序;
shell
shell脚本
创建shell脚本
以下面的内容为例,
- 创建一个
test.sh
脚本,放在/home/Desktop
目录下,
$ touch /home/Desktop/test.sh
- 编辑
test.sh
并写入下面的内容:
$ vim /home/Desktop/test.sh
#!/bin/bash
echo "123" >> /home/Desktop/test.txt
- 给该脚本可执行权限
$ chmod +x /home/Desktop/test.sh
$ chmod 777 /home/Desktop/test.sh
配置crontab
- 编辑
crontab
入如下所示的内容:
$ crontab -e
* * * * * root sh /home/Desktop/test.sh
root
表示执行用户,sh /home/Desktop/test.sh
是定时程序执行的指令
- 重新加载定时程序,
service crond reload
- 重启
crontab
服务
systemctl restart crond.service
相关日志文件
其他运行中需要关注的操作:
-
tail /var/log/cron
查看crontab
日志
shell命令
以下面的内容为例 5,
- 在
crontab
中写了如下的一个任务:
* * * * * echo "hello world"
注意单纯 echo
,从屏幕上看不到任何输出,因为 cron
把任何输出都 email
到 root
的信箱了。可以把这个输出重定向到另外一个标准输出文件中,比如说重定向输出到一个 txt
文件中,
* * * * * echo "hello world" >> /tmp/test.txt
若执行有效通过 ls -l
可以看到 test.txt
文件的时间发生变化,cat test.txt
后 hello world
写入
- 以格式化时间命名文件
* * * * * cp /tmp/test.txt /tmp/$(date %Y-%m-%d %H:%M:%S)
可以看见每分钟被创建的以当前时间命名的文件
python
参考这里 2’ 6
创建py脚本
以下面的内容为例,
- 创建一个
test.py
脚本,放在/home/Desktop
目录下,
$ touch /home/Desktop/test.py
- 编辑
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()
- 给该脚本可执行权限
$ chmod +x /home/Desktop/test.py
$ chmod 777 /home/Desktop/test.py
配置crontab
- 编辑
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
- 重启
crontab
服务
systemctl restart crond.service
相关日志文件
其他运行中需要关注的操作:
-
tail /var/log/cron
查看crontab
日志 -
tail /home/Desktop/test.py.log
more /home/Desktop/test.py.log
查看python
运行日志
参考链接
centos7 设置 查看 开机 启动项(自启项) ↩︎
crontab定时启动python脚本 ↩︎ ↩︎
设置crontab定时器及开启自启 ↩︎
linux定时任务no crontab for root 解答 ↩︎
linux 检测crontab ↩︎
crontab定时执行python文件 ↩︎