当你需要在Linux系统中定期执行某些任务时,crontab(cron table)是一个非常有用的工具。它允许你根据预定的时间表创建和管理定时任务。
一、从守护进程到crond进程
1.1 Linux 守护进程
按照进程的功能和运行的程序分类,进程可划分为两大类。
- 系统进程:可以执行内存资源分配和进程切换等管理工作;而且,该进程的运行不受用户的干预,即使是root用户也不能干预系统进程的运行。
- 用户进程:通过执行用户程序、应用程序或内核之外的系统程序而产生的进程,此类进程可以在用户的控制下运行或关闭。
针对用户进程,又可以分为交互进程、批处理进程和守护进程三类。
- 交互进程:由一个shell终端启动的进程,在执行过程中,需要与用户进行交互操作,可以运行于前台,也可以运行在后台。
- 批处理进程:该进程是一个进程集合,负责按顺序启动其他的进程。
- 守护进程:守护进程是一直运行的一种进程,经常在Linux系统启动时启动,在系统关闭时终止。它们独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。例如,httpd进程一直处于运行状态,等待用户的访问。还有经常用的
crond
进程,这个进程类似于Windows地计划任务,可以周期性地执行用户设定的某些任务。
1.2 任务调度进程crond
crond
是 Linux 下用来周期性地执行某种任务或等待处理某些事件的一个守护进程,与Windows下的计划任务类似。当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
Linux下的任务调度分为两类,系统任务调度和用户任务调度。
(1)系统任务调度: 系统周期性要执行的工作,比如写缓存数据到硬盘、清理日志等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
打开该文件,可以看到这些内容:nvim /etc/crontab
上图中:
- 第七行:指定系统使用的shell程序;
- 第八行:命令的查找路径。(这前面2行就是设置环境变量)
- 18~21行:定时任务
(2)用户任务调度: 用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用crontab
工具来定制自己的计划任务。所有用户定义的crontab 文件都保存在 /var/spool/cron
目录中。其文件名与用户名一致。
二、 crontab 详细介绍
crontab文件:每个用户都有一个独立的crontab文件,用于存储他们的定时任务。这些文件通常位于/var/spool/cron/
目录下,或者还有一级目录,以用户名命名。
2.1 crontab 命令格式
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文件时给出确认提示。
2.2 crontab文件的含义
用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置。
它的格式共分为7个字段,前5个字段是时间设定段,第6个字段是执行的用户,第7个字段是要执行的命令段,格式如下。
minute hour day month week user command
其中。
minute
:表示分钟,可以是0~59的任何整数。
hour
:表示小时,可以是0~23的任何整数。
day
:表示日期,可以是1~31的任何整数。
month
:表示月份,可以是1~12的任何整数。
week
:表示星期几,可以是0~7的任何整数,这里的0或7代表星期日。
user
:用户名,执行该任务的用户。也可以没有这个字段,文件中定义的任务将有文件的所有者执行。
command
:表示要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
在以上各个字段中,还可以使用以下特殊字符。
星号(*):代表所有可能的值。例如,month 字段如果是星号,则表示在满足其他字段的制约条件后每月都执行该命令操作。
逗号(,):可以用逗号隔开的值指定一个列表范围。例如,“1,2,5,7,8,9”。
中杠(-):可以用整数之间的中杠表示一个整数范围。例如,“2-6”表示“2,3,4,5,6”。
正斜线(/):可以用正斜线指定时间的间隔频率。例如,“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段中,表示每10分钟执行一次
2.3 实操:编写crontab文件
我的系统里,crontab文件的位置是:/var/spool/cron/crontabs/root
打开,准备编写新任务是,发现:
提示不要直接编辑这个文件,而应该编辑另一个临时的文件。
编辑,肯定是能编辑的,我有权限就行。但是上面的方式可能更安全一点,防止错误,增加可维护性。那就按照推荐的来吧。
使用编辑命令:crontab -e
,会先让你选择编辑器,我使用vim来编辑。
发现默认打开的是这个临时文件:
那就来编辑一下:
编写了一个定时任务来进行测试,每隔一分钟,在/root/crontest.txt这个文件末尾追加一行,内容是系统的当前时间(这里用到了date命令和输出重定向)。
注意:这里我添加了前面2行,配置环境变量,是为了防止执行任务的时候找不到命令。
编辑完成后保存,退出nvim。然后再查看var目录下那个crontab文件,自动就更新了(那个临时的文件会自动删除)。
来看看定时任务的执行效果:
没问题。
crontab在Linux系统中有许多实际应用场景,以下是一些常见的例子:
-
定时备份:你可以使用crontab来定期执行备份脚本,以保护重要数据。例如,每天晚上执行一个备份脚本,将关键文件复制到另一个位置或远程服务器。
-
日志清理:系统日志和应用程序日志可能会占用大量磁盘空间。使用crontab可以定期清理过时的日志文件,以避免磁盘空间不足问题。
-
系统维护任务:crontab可以用于自动化各种系统维护任务,如更新软件包、执行磁盘碎片整理、优化数据库等。
-
数据同步:如果你有多个服务器需要进行数据同步,你可以使用crontab来定期运行数据同步脚本,以确保数据的一致性。
-
网站监控:你可以使用crontab来定期检查网站的可用性和响应时间,以及监测服务器的负载情况。这样可以及时发现并解决潜在的问题。
-
定时任务提醒:你可以使用crontab来创建提醒任务,例如每天早上发送一封电子邮件或弹出通知来提醒你重要的任务或事件。
这只是一小部分crontab的应用示例。实际上,你可以根据自己的需求和创意使用crontab来执行各种定时任务,提高工作效率和自动化操作。
把 永 远 爱 你 写 进 诗 的 结 尾 ~