linux中的cron的使用

时间:2023-01-13 12:58:30

(目录)


一、crontb命令的基本语法

1. crontab命令格式

crontab [-u user] -e -l -r
-u 用户名,不加-u参数默认为当前用户。
-e 编辑crontab文件。
-l 列出crontab文件中的内容。取值来源为/var/spool/cron下对应的文件
-r 删除crontab文件。

2. crontab命令格式

# 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
 |  |  |  |  |
 *  *  *  *  * command/script

注意:命令行或者脚本一定要配置成绝对路径。

3. 特殊字段说明

星号(*):代表所有可能的值,例如在第1列表示每分钟执行,第2列表示每小时执行,第3列表示每天执行。

逗号(,):可以用逗号隔开的值表示指定一个列表范围,例如,在第1列设置15,30,45表示在第15分钟、30分钟、45分钟执行。

中杠(-):可以用整数之间的中杠表示一个整数范围,例如"2-6"表示2,3,4,5,6

正斜线(/):可以用正斜线指定时间的间隔频率,例如第2列设置成"*/2",表示每两小时执行一次。

4. 实例

每天晚上10点运行rumenz.sh脚本
0 22 * * * /root/rumenz.sh

每月的1,3,7的早上8.30运行rumenz.sh
30 8 1,3,7 * * /root/rumenz.sh

每周六,日的的凌晨2点执行rumenz.sh
0 2 * * 6,0 /root/rumenz.txt

每天的的18点到23点每30分执行rumenz.sh
0,30 18-23 * * /root/rumenz.sh
或者
*/30 18-23 * * /root/rumenz.sh

每天凌晨2点访问一个网址
0 2 * * * /usr/bin/curl https://rumenz.com

crontab每10秒执行一次rumenz.sh
* * * * * /root/rumenz.sh
* * * * * sleep 10;/root/rumenz.sh
* * * * * sleep 20;/root/rumenz.sh
* * * * * sleep 30;/root/rumenz.sh
* * * * * sleep 40;/root/rumenz.sh
* * * * * sleep 50;/root/rumenz.sh

每 90 分钟运行一次rumenz.sh
0 0-21/3 * * * /root/rumenz.sh
30 0-22/3 * * * /root/rumenz.sh
需要两个表达式实现

每90秒执行一次rumenz.sh
*/3 * * * * /root/rumenz.sh
*/3 * * * * sleep 90;/root/rumenz.sh

二、如何添加/编辑 Crontab

要在 crontab 中添加或更新作业,请使用以下命令。它将在编辑器中打开一个 crontab 文件,可以在其中添加/更新作业。

crontab -e

默认情况下,它将编辑当前登录用户的 crontab 条目。要编辑其他用户 crontab 使用命令如下

crontab -u username -e

要查看当前用户的 crontab 条目,请使用以下命令。

crontab -l

使用 -u 后跟用户名来查看指定用户的 crontab 条目。

crontab -u username -l

20 个有用的 Crontab 示例

以下是使用 crontab 在 Linux 系统中调度 cron 作业的示例列表。

1. 安排一个 cron 在每天凌晨 2 点执行。
这对于每天安排数据库备份很有用。
0 2 * * * /bin/sh bashup.sh

2. 安排一个 cron 每天执行两次。
下面的示例命令将在每天上午 5 点和下午 5 点执行。您可以通过逗号分隔指定多个时间戳。
0 5,17 * * * /scripts/script.sh

3. 安排一个 cron 每分钟执行一次。
通常,我们不需要每分钟执行任何脚本,但在某些情况下,您可能需要对其进行配置。
* * * * * /scripts/script.sh

4. 安排一个 cron 在每周日下午 5 点执行。
这种类型的 cron 可用于执行每周任务,例如日志轮换等。
0 17 * * sun /scripts/script.sh

5. 安排一个 cron 每 10 分钟执行一次。
如果你想以 10 分钟的间隔运行你的脚本,你可以像下面这样配置。这些类型的 cron 可用于监控。
*/10 * * * * /scripts/monitor.sh
*/10表示每 10 分钟运行一次。就像你想每 5 分钟执行一次一样,使用 */5。

6. 安排一个 cron 在选定的月份执行。
有时我们需要安排一个任务只在选定的月份执行。下面的示例脚本将在 1 月、5 月和 8 月运行。
* * * jan,may,aug * /script/script.sh

7. 安排一个 cron 在选定的日期执行。
如果您需要安排任务仅在选定的日期内执行。下面的示例将在每个星期日和星期五下午 5 点运行。
0 17 * * sun,fri /script/script.sh

8. 安排一个 cron 在每个月的第一个星期日执行。
无法通过时间参数安排脚本仅在第一个星期天执行脚本,但我们可以使用命令字段中的条件来执行此操作。
0 2 * * sun [ $(date +%d) -le 07 ] && /script/script.sh

9. 安排一个 cron 每四个小时执行一次。
如果您想以 4 小时的间隔运行脚本。它可以像下面这样配置。
0 */4 * * * /scripts/script.sh

10. 安排一个 cron 在每个星期日和星期一执行两次。
将任务安排为仅在周日和周一执行两次。使用以下设置来做到这一点。
0 4,17 * * sun,mon /scripts/script.sh

11. 安排一个 cron 每 30 秒执行一次。
无法通过时间参数安排每 30 秒执行一次任务,但可以通过安排相同的 cron 两次来完成,如下所示。
* * * * * /scripts/script.sh
* * * * * sleep 30; /scripts/script.sh

12. 在单个 cron 中安排多个任务。
使用单个 cron 配置多个任务,可以通过用分号 (;) 分隔任务来完成。
* * * * * /scripts/script.sh;/scripts/scrit2.sh

13. 安排任务每年执行(@yearly)。
@yearly 时间戳类似于0 0 1 1 *。它会在每年的第一分钟执行一项任务,发送新年问候可能有用
@yearly /scripts/script.sh

14. 安排任务每月执行(@monthly)。
@monthly 时间戳类似于0 0 1 * *。它将在每月的第一分钟执行任务。每月执行诸如支付账单和向客户开具发票等任务可能会很有用。
@monthly /scripts/script.sh

15. 安排每周执行的任务 (@weekly)。
@weekly 时间戳类似于0 0 * * mon。它将在一周的第一分钟执行一项任务。执行每周任务(例如系统清理等)可能很有用。
@weekly /bin/script.sh

16. 安排每天执行的任务 (@daily)。
@daily 时间戳类似于0 0 * * *。它将在每天的第一分钟执行一项任务,它可能有助于完成日常任务。
@daily /scripts/script.sh

17. 安排任务每小时执行一次(@hourly)。
@hourly 时间戳类似于0 * * * *。它将在每小时的第一分钟执行一项任务,执行每小时任务可能很有用。
@hourly /scripts/script.sh

18. 安排在系统重启时执行的任务 (@reboot)。
@reboot 对于您希望在系统启动时运行的任务很有用。它将与系统启动脚本相同。它对于在后台自动启动任务很有用。
@reboot /scripts/script.sh

19. 将 Cron 结果重定向到指定的电子邮件帐户。
默认情况下,cron 将详细信息发送到调度 cron 的当前用户。如果您想将其重定向到您的其他帐户,可以通过设置 MAIL 变量来完成,如下所示
crontab -l
MAILTO=xxx@163.com

20. 将所有 cron 备份到纯文本文件。
我建议将所有作业条目的备份保存在一个文件中。这将帮助您在意外删除的情况下恢复 cron。
检查当前计划的 cron:
crontab -l
0 2 * * * /script/backup.sh

将 cron 备份到文本文件:
crontab -l > cron-backup.txt
cat cron-backup.txt
0 2 * * * /script/backup.sh

删除当前计划的 cron:
crontab -r
crontab -l
no crontab for root

从文本文件恢复 cron:
crontab -l
0 2 * * * /script/backup.sh

三、命令参数

crontab常用的使用格式有如下两种:

crontab [-u user] [file]
crontab [-u user] [-e|-l|-r |-i]

选项含义如下:

-u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。

file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。

-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。

-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。

-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。

-i:在删除用户的crontab文件时给确认提示。

四、系统级任务调度/etc/crontab

在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。 /etc/crontab文件包括下面几行:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户。

五、crontab调试解析神器

工具地址:https://crontab.guru

六、需注意的问题

1. 环境变量

所有命令尽量都使用绝对路径。 使用source命令

* * * * * source /$HOME/.bash_profile && command

2. 整点时间配置误区

在整点时间设置时可能出现的错误,例如,设定每天2点执行一次任务,很多朋友可能这么写过:

* 2 * * * command

很明显,这个时间写法是错误的,当我们听到每天2点执行一次某任务时,很多人会把重点放在2点,而忽略了执行一次的需求。上面这个定时任务他会在2点开始执行,每分钟执行一次,总共执行60次。

linux中的cron的使用 正确的写法应该是这样的:

0 2 * * * command

linux中的cron的使用

3. 特殊符号%问题

%在crontab中是特殊符号,具体含义如下: 第一个%表示标准输入的开始,其余%表示换行符,看下面两个例子:

* * * * * cat >> /tmp/cat.txt 2>&1 % stdin out

查看/tmp/cat.txt的内容为:

stdin out

再看下面这个例子:

* * * * * cat >> /tmp/cat1.txt 2>&1 % stdin out 1 % stdin out 2 % stdin out 3

查看 /tmp/cat1.txt的内容如下:

stdin out 1
stdin out 2
stdin out 3

有输出内容可知,第一个%表示标准输入的开始,其余%表示换行符。

既然"%"是特殊字符,那么在crontab中使用时,就要特别注意,怎么使用这些特殊字符呢,很明显,使用转移字符即可,例如:

* * * * * cat >> /tmp/cat2.txt 2>&1 % Special character escape \%.

查看输出/tmp/cat2.txt 输出内容如下:

Special character escape %.

可以看到,执行成功了。

4. 关于crontab的输出重定向

在crontab执行的计划任务中,有些任务如果不做输出重定向,那么原本会输出到屏幕的信息,会以邮件的形式输出到某个文件中。例如,执行下面这个计划任务:

* * * * * /bin/date

这个计划任务是没有做输出重定向的,他的主要用途是输出时间,由于没有配置输出重定向,那么这个时间信息默认将以邮件的形式输出到/var/spool/mail/$USER(这个$USER对应的是系统用户,这里是root用户)文件中。

这个邮件输出最好关闭,怎么关闭呢,只需设置/etc/crontab文件中MAILTO环境变量为空即可:

MAILTO=""
* * * * * /bin/date

这样,就不会发邮件信息到/var/spool/mail/$USER下了,但是问题并没有彻底解决,关闭mail功能后,输出内容将继续写入到/var/spool/clientmqueue中,长期下去,可能占满分区的inode资源,导致任务无法执行。

为了避免此类问题发生,建议任务都加上输出重定向,例如,可以在crontab文件中设置如下形式,忽略日志输出:

0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1

5. 调试crontab问题的一般思路

要解决crontab相关异常问题,可按照如下思路进行调试:

(1). 通过/var/log/cron日志确认任务是否执行

(2). 如未执行则分析定时语句,是否是环境变量问题、特殊字符问题、时间配置问题、权限问题等。

(3). 确认crond服务开启,如果定时语句也正确,检查crond服务是否开启。

Systemd方式(centos7及以上)

[root@SparkWorker1 spool]# systemctl status crond.service

SysVinit方式(centos7以下)

[root@SparkWorker1 spool]# service crond status

(4)确认定时任务中命令是否执行成功

这个问题可通过输出获取错误信息进行调试,方法就是利用重定向获取输出,然后进行分析。举例如下:

* * * * * python /usr/local/dyserver/dypos.py >> /tmp/dypos.log 2>&1

通过加上“/tmp/dypos.log 2>&1”,就可以很快定位问题,因为这个dypos.py脚本在执行的时候会把错误信息都输出到dypos.log 中。