Linux系统使用超详细(七)~定时任务:crontab

一、定时任务简介

在Linux中,定时任务是一种机制,允许用户在预定的时间自动执行特定的命令或脚本。它可以通过操作系统自带的cron工具来管理。

1.1cron工具概述
cron是Linux中最常用的定时任务工具,是Linux系统中基于时间的任务调度器,它允许用户在指定的时间点或时间间隔内执行任务。每个用户都有一个crontab文件,用于存储他们的定时任务。cron命令的配置文件由多行组成,每行代表一个定时任务,每个任务由时间字段和要执行的命令组成。时间字段指定任务执行的时间和频率,可以设置分钟、小时、日期、星期和月份。cron任务的精确度最高到分钟级别。

1.2crontab命令简述
我们经常使用的是crontab命令是cron table的简写,它是cron的配置文件,也可以叫它作业列表,可以在以下文件夹内找到相关配置文件。

/var/spool/cron/ 目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名
/etc/crontab 这个文件负责调度各种管理和维护任务。
/etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。
可以把脚本放在/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly目录中,让它每小时/天/星期、月执行一次。
Linux crontab常用的crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该文件包含了一系列的定时任务,每个任务由一个时间字段和要执行的命令组成。

通常,crontab储存的指令被守护进程激活, 守护进程crond常常在后台运行,并定期检查是否有预定的作业需要执行。默认情况下,crond每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。如果发现有要执行的任务,crond会自动执行它们。

当安装完成操作系统之后,默认便会启动此任务调度命令。crond 命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。

注意:

新创建的 cron 任务,不会马上执行。因为cron任务的执行时间与设置的时间字段和当前时间相关。

当你创建一个cron任务时,它会被添加到cron的任务列表中,并在下一次符合时间条件的时候执行。如果没有符合时间条件的任务,那么任务将在下一个适合的时间点执行。

如果你希望立即执行一个cron任务,可以通过重启cron服务来实现。这样做将重新加载cron配置文件并立即开始执行新添加的任务。

可以使用以下命令重启cron服务:

sudo service crond restart
另外,还有一种方法是手动运行任务的命令或脚本来立即执行任务,而不依赖于cron。这样可以确保任务立即开始执行,而不必等待cron的调度。

总之:

新创建的cron任务不会立即执行,它们会在下一个合适的时间点根据设置的时间字段自动执行。要立即执行任务,可以重启cron服务或手动运行任务的命令或脚本。

二、crontab安装与检查
我安装的是centos7.0版本,按照此版本描述:

2.1安装步骤
在CentOS 7.0上,crontab命令通常是默认安装的。但是可以按照以下步骤来确认并安装crontab:

①确认crontab是否已经安装:

1)使用which命令:which命令用于显示给定命令的完整路径。可以使用which命令来确定是否可以找到crontab可执行文件的路径。

which crontab
结果如图:

 

2)使用whereis命令:whereis命令用于查找给定命令的二进制文件、源代码和帮助页面等信息。

whereis crontab
结果如图:

在CentOS 7.0中,crontab默认安装路径是/usr/bin/crontab。

②使用以下命令安装crontab:

sudo yum install cronie
运行此命令将安装cronie软件包,其中包含crontab命令和cron守护进程。

③启动cron服务:

sudo systemctl start crond
将启动cron服务,并使其立即生效。

④设置cron服务在系统启动时自动启动:

sudo systemctl enable crond
运行此命令,cron服务将被设置为在每次系统启动时自动启动。

在完成上述这些步骤后,应该能够使用crontab命令来管理定时任务。

2.2查看crontab的状态
执行以下命令:

sudo systemctl status crond
结果如图:

 

这将显示cron服务(即crond)的当前状态,包括是否正在运行以及最近的日志信息。如果cron服务处于活动状态,它将显示为"active (running)"。如果服务未运行,它可能会显示为"inactive"或"dead"。

另一个命令也是查看状态,即

crontab -l
如果系统中已经安装了crontab,将看到当前用户的定时任务列表。如果显示类似于"no crontab for <username>"的消息,那么crontab尚未安装。如下所示:

 

区分crontab -l和sudo systemctl status crond:

crontab -l用于查看当前用户的crontab文件中定义的定时任务列表。这个命令列出了当前用户设置的所有定时任务,包括任务的执行时间和要运行的命令。它只能查看当前用户的crontab文件,而无法查看其他用户的定时任务。

sudo systemctl status crond用于查看cron服务(即crond)的状态。这个命令显示cron服务的当前状态,包括是否正在运行以及最近的日志信息。它可以用于检查cron服务是否正常运行。需要管理员权限或root用户身份才能运行该命令。

因此:

crontab -l用于查看用户级别的定时任务列表(用来检查用户的crontab状态,如果crontab已成功安装,则列出当前用户的定时任务列表。如果没有任何输出,则表示该用户没有设置任何定时任务。)

而sudo systemctl status crond用于查看cron服务的状态,会显示cron服务的运行状态、PID(进程ID)、最近的活动记录等。但是需要使用sudo或以root身份运行该命令,因为只有root用户能够查看和管理系统级别的服务。

2.3查看crontab服务
检查crontab服务是否已设置为开机启动,执行以下命令:

sudo systemctl is-enabled crond
该命令将显示crontab服务的启用状态。如果输出为"enabled",则表示crontab服务已设置为开机启动。如果输出为"disabled",则表示crontab服务未设置为开机启动。

 

另外,还可以使用以下命令来检查crontab服务的启动配置文件是否存在:

ls /etc/systemd/system/multi-user.target.wants/crond.service
如果该命令返回了crond.service文件的路径,则表示crontab服务已经设置为开机启动。如果没有任何输出,则表示crontab服务未设置为开机启动。

如果cron服务未设置为开机启动,可以使用以下命令将其设置为开机启动:

sudo systemctl enable cron
运行此命令后,cron服务将被设置为开机启动。

注意:

这些命令需要管理员权限或root用户身份才能运行。

最后可以再次运行systemctl is-enabled cron命令来验证cron服务的开机启动状态。

三、crontab命令
crontab命令是用于管理定时任务的命令行工具。它提供了多种选项和参数,可以用来创建、编辑、查看和删除用户的定时任务。

3.1常用命令
以下是一些常用的crontab命令:

crontab -e:编辑当前用户的定时任务列表。该命令会在默认编辑器中打开定时任务文件,你可以添加、修改和删除定时任务。
crontab -l:列出当前用户的定时任务列表。该命令会将定时任务以文本形式输出到终端。
crontab -r:删除当前用户的所有定时任务。该命令会删除当前用户的定时任务文件,并且无法恢复,请谨慎使用。
crontab -u <username> -e:以指定用户的身份编辑定时任务列表。使用该命令可以编辑其他用户的定时任务文件,需要管理员权限或root用户身份。
crontab -u <username> -l:列出指定用户的定时任务列表。该命令会将指定用户的定时任务以文本形式输出到终端
这些命令都是在终端中执行的,需要具备足够的权限(如管理员权限或root用户身份)。

注意:

crontab命令接受cron表达式来指定定时任务的执行时间。 以上命令中的<username>应替换为实际的用户名。对于一般用户,只能管理自己的定时任务,而对于root用户,可以管理系统中所有用户的定时任务。

更多关于crontab命令的选项和用法,请参考相关文档或运行man crontab命令来查看帮助信息。

3.2定时任务的写法
* * * * * 命令名
│ │ │ │ └星期(0-7)(0和7都代表星期天)
│ │ │ └──月(1-12)
│ │ └────日(1-31)
│ └──────小时(0-23)
└────────分钟(0-59)

特殊符号:

* 代表所有。星号通常用于表示时间字段中的"任意值"。当星号出现在时间字段中时,表示该字段可以匹配该字段的所有可能取值。例如,* * * * * command 表示每分钟执行一次该任务,因为所有的时间字段都设置为星号。

(中文逗号)

中文逗号用于将多个时间字段的取值组合在一起。它的作用是表示“或”关系,即在指定的时间点中选择其中一个时间点执行任务。例如,0 8,12 * * * command 表示在每天的早上8点和中午12点都执行该任务。
,

(英文逗号)

英文逗号用于分隔多个独立的时间字段取值。它的作用是将多个时间点分开,分别表示不同的时间点来执行任务。例如,0 8 * * 1,3,5 command 表示在周一、周三和周五的早上8点执行该任务。
-
短横线(-)用于表示连续的时间范围。它将两个数字之间的所有值都包括在内。

表示范围 至 :比如 1-5 * * * * command 表示每小时的1分钟到5分钟之间都执行该命令。

/数 斜杠用于指定时间字段的步长。它表示将时间字段跳过一定数量的取值。例如,*/10 * * * * command 表示每隔10分钟执行一次该任务。
总结:

中文逗号表示同时执行任务,英文逗号表示分别执行任务。

注意:

当你在定时任务命令中引用到具体的文件、脚本或命令时,最好使用绝对路径来确保正确执行。这是因为定时任务的执行环境可能与你当前的工作目录不同。

当你使用相对路径时,定时任务可能无法找到所需的文件或脚本,因为它们不在定时任务执行时的当前工作目录中。

通过使用绝对路径,你可以明确指定定时任务所需的文件或命令的位置,而不依赖于当前工作目录。这有助于避免由于路径问题导致的定时任务执行失败。

以下是一个示例,展示了如何在定时任务命令中使用绝对路径:

* * * * * /usr/bin/python3 /home/user/script.py
示例中定时任务将每分钟执行一次 /home/user/script.py 这个 Python 脚本。/usr/bin/python3 是 Python 解释器的绝对路径。

因此:建议在定时任务中,尤其是需要执行特定文件或脚本时,使用绝对路径来确保命令能够正确执行。

3.3实例
下面是一些Crontab定时任务例子,其中加#的例子来源于Linux中Crontab(定时任务)命令详解及使用教程 - 天乐博客

1)每1分钟执行一次
* * * * *
2)每小时的第3和第15分钟执行
3,15 * * * *
3)在上午8点到11点的第3和第15分钟执行
3,15 8-11 * * *
4)每两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * *
5)每个星期一的上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1

6)每晚的21:30重启smb
30 21 * * * /etc/init.d/smb restart
7)每月1、10、22日的4 : 45重启smb
45 4 1,10,22 * * /etc/init.d/smb restart
8)每周六、周日的1:10重启smb
10 1 * * 6,7 /etc/init.d/smb restart
9)每天18:00至23:00,整点和整半点重启smb
0,30 18-23 * * * /etc/init.d/smb restart
10)每星期六的晚上11:00 pm重启smb
0 23 * * 6 /etc/init.d/smb restart
11)每一小时重启smb
* */1 ** * /etc/init.d/smb restart
12)晚上11点到早上7点之间,每一小时重启smb
* 23-7/1 * * *
13)每月的4号与每周一到周三的11点重启smb
0 11 4 * 1-3 /etc/init.d/smb restart
14)一月一号的4点重启smb
0 4 1 1 * /etc/init.d/smb restart
15)每小时的第1分钟执行/etc/cron.hourly目录内的脚本
1 * * * * /etc/cron.hourly
16)每一小时重启smb
0 */1 * * * /etc/init.d/smb restart

#每晚的21:30 重启apache
30 21 * * * /usr/local/etc/rc.d/lighttpd restart
#每月1、10、22日的4 : 45重启apache
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
#每周六、周日的1 : 10重启apache
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
#每天18 : 00至23 : 00之间每隔30分钟重启apache
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
#每星期六的11 : 00 pm重启apache
0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
#晚上11点到早上7点之间,每隔一小时重启apache
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
#每一小时重启apache
* */1 * * * /usr/local/etc/rc.d/lighttpd restart
#每月的4号与每周一到周三的11点重启apache
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
#一月一号的4点重启apache
0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
#每半小时同步一下时间
*/30 * * * * /usr/sbin/ntpdate cn.pool.ntp.org
#每两个小时重启一次apache
0 */2 * * * /sbin/service httpd restart
#每天7:50开启ssh服务
50 7 * * * /sbin/service sshd start
#每天22:50关闭ssh服务
50 22 * * * /sbin/service sshd stop
#每月1号和15号检查/home 磁盘
0 0 1,15 * * fsck /home
#每小时的第一分执行 /home/bruce/backup这个文件
1 * * * * /home/bruce/backup
#每周一至周五3点钟,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的文件。
00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} \;
#每月的1、11、21、31日是的6:30执行一次ls命令
30 6 */10 * * ls


四、添加定时任务
4.1使用crontab -e命令
用该命令编辑当前用户的定时任务文件

打开终端,使用root或具有sudo权限的用户登录。

①执行以下命令来编辑当前用户的定时任务文件:

crontab -e
打开默认编辑器并载入当前用户的定时任务文件。

②点按键盘 i 进入编辑模式,看到如下图标表示可以编辑内容:

 

③将需要设置的定时任务命令代码写入该文件,以下是3个示例:

#每天凌晨3点备份 /var/www/html 目录到 /backup 目录:
0 3 * * * cp -r /var/www/html /backup
#每周一至周五的上午9点到下午5点,每小时清理 /tmp 目录下的临时文件:
0 9-17 * * 1-5 rm -rf /tmp/*
#每月的第一天凌晨2点运行一个自定义的脚本 /home/user/script.sh:
0 2 1 * * /bin/bash /home/user/script.sh

④点按键盘 ESC 退出编辑模式;

⑤点按 英文冒号 : ,输入wq 即保存文件退出编辑。终端可以看到提示:

 

在1.2章节中讲到:新创建的cron任务不会立即执行,它们会在下一个合适的时间点根据设置的时间字段自动执行。要立即执行任务,可以重启cron服务或手动运行任务的命令或脚本。

⑥因此可以重启服务 ,执行如下命令:

sudo service crond restart
⑦查看创建的任务列表:

crontab -l
结果如图所示:

 

⑧可以选择查看自己的定时任务文件位置:

 

备注:

使用crontab -e命令会打开当前用户的定时任务文件。具体来说,它会使用系统指定的默认文本编辑器打开一个临时文件,该文件包含了当前用户的定时任务列表。

定时任务文件通常位于 /var/spool/cron 文件中。

注意:

每个用户的定时任务文件都存储在不同的位置。对于每个用户的定时任务文件,只有拥有相应用户的权限才能查看和编辑这些文件。

4.2创建一个独立的定时任务文件
创建一个新的文件,用于存放定时任务,例如 /etc/cron.d/mytasks。在该文件中添加你的定时任务,并保存文件。使用vi编辑器编辑文件并保存,根据实际需求修改路径和命令。确保在 root 用户权限下运行或具有足够的权限来执行定时任务。比如:

①创建一个新的定时任务文件,例如 /etc/cron.d/mytasks。使用任意文本编辑器打开该文件:

sudo vi /etc/cron.d/mytasks
注意:需要以 root 权限执行该命令。

②在打开的文件中,添加你的定时任务。确保每行代表一个定时任务,并且使用正确的时间规范和命令。例如,我们可以添加一个示例任务到 /etc/cron.d/mytasks 文件中:

0 3 * * * root cp -r /var/www/html /backup
③保存文件并关闭文本编辑器

④使用以下命令检查该定时任务是否已经成功添加到你创建的独立定时任务文件中:

sudo cat /etc/cron.d/mytasks
显示文件的内容,其中应包含你添加的定时任务。确认文件中列出了你的任务。

⑤确认后,系统将按照配置的时间规范来执行你的定时任务。可以使用以下命令验证任务是否正在执行:

sudo tail -f /var/log/cron
该命令将实时显示 cron 日志,你可以观察任务是否按计划执行。

本章节补充:

每个用户只能有一个crontab文件,用于管理定时任务。这个文件通常位于/var/spool/cron/目录下,其中是用户的用户名。

在用户的crontab文件中,可以定义多个定时任务。每个任务占据一行,并且由时间规范和要执行的命令组成。例如:

* * * * * command1 # 每分钟执行一次 command1
0 12 * * * command2 # 每天12点执行 command2
每个任务的时间规范可以使用cron表达式来指定执行时间。通过在用户的crontab文件中添加多个任务行,你可以为该用户创建多个定时任务。

总结起来,每个用户只能有一个crontab文件,但这个文件内可以包含多个定时任务。

注意:

如果你编辑了用户的crontab文件并保存更改,系统将自动更新相关的调度信息。这样,你的定时任务将按照新的设置进行执行。

如果需要删除或修改特定定时任务,你可以使用crontab -e命令打开用户的crontab文件进行编辑。然后,你可以注释或删除不再需要的任务行,或者添加新的任务行。记得保存修改后的文件。

总结:

①开启定时任务:运行 crontab -e 命令编辑定时任务文件,编辑器中添加你要开启的定时任务的行,保存并退出编辑器,定时任务重新启用。
②关闭定时任务:运行 crontab -e 命令编辑定时任务文件,编辑器中将需要停止的定时任务行注释掉,即在行首添加 # 符号,保存并退出编辑器,定时任务重新启用。
③删除定时任务:运行 crontab -e 命令编辑定时任务文件,编辑器中删除你想要删除的定时任务行,保存并退出编辑器,定时任务重新启用。

 

posted @ 2024-03-27 16:48  挖坑达人  阅读(3494)  评论(0编辑  收藏  举报