本文总结如何使用 crontab
创建定时任务及开启自启项 1。
本文基于 CentOS 7.9
系统所写。
Updated: 2022 / 8 / 15
systemctl list-unit-files
enabled
是开机启动,disabled
是开机不启动),如下图所示:systemctl list-unit-files | grep enabled
enabled
以 redis
为例,
systemctl enable redis
参考这里 2’ [^]
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
其文件内容格式如下:
$ 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
参数 | 含义 |
---|---|
PATH=.... | 这里输入运行档的搜寻路径。使用默认的路径配置就已经很足够了。 |
MAILTO=root | MAILTO 这个字段说明了当 /etc/crontab 文件中的例行性命令发生错误时,会将错误信息或屏幕显示的信息传递给谁。由于 root 无法在客户端收信,因此,可以将这个 email 改成自己普通用户帐号。 |
以 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
这个命令来创建工作排程之后,该项工作就会被纪录到 /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
service crond stop
service crond restart
service crond reload
service crond status
crond
服务的状态chkconfig crond on
chkconfig –list crond
crond
服务$ chkconfig --list crond > /home/ssd/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 '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 crond off
crond
服务:crontab -e
/etc/crontab
是针对系统的任务crontab -l
crontab -l -u root
root
的所有调度任务crontab -r
以下面的例子说明 crontab
的任务该如何编辑:
0 6 * * * echo "Good morning." >> /tmp/test.txt
//注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。
0 */2 * * * echo "Have a break now." >> /tmp/test.txt
0 23-7/2,8 * * * echo "Have a good dream" >> /tmp/test.txt
0 11 4 * 1-3 command line
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
innd/bbslin
这个指令:10,40 * * * * innd/bbslink
bin/account
这个指令:1 * * * * bin/account
逻辑分为以下三点:
① 建立一个可执行文件 (权限要求自己定义,有权限执行就行);
② vim /etc/crontab
或者 crontab -e
编辑定时程序;
③ 程序会根据定时代码定时执行程序;
以下面的内容为例,
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 777 /home/Desktop/test.sh
crontab
入如下所示的内容:$ crontab -e
* * * * * root sh /home/Desktop/test.sh
root
表示执行用户,sh /home/Desktop/test.sh
是定时程序执行的指令
2.重新加载定时程序,
service crond reload
crontab
服务systemctl restart crond.service