01 何为计划任务
计划任务,顾名思义:计划在未来某个时间点要执行的任务,也可称为定时任务。有一次性的计划任务,也有周期性的计划任务。
一次性的计划任务就相当于待办,如今天下午三点开会,那么它只会在今天下午三点提醒一次;周期性的计划任务就和我们手机闹钟一样,如设置工作日7点整的闹钟,那么每个工作日7点整闹钟都会准时响。
但我们平常说的计划任务大多是指周期性的计划任务,用来执行那些需要重复执行的命令和工作,如定时重启、打包、清理日志等等,大大满足了日常运维需求。
在Linux中,一次性的计划任务由at和batch命令完成;而周期性的计划任务则涉及到两个服务,分别是crond和anacron。今天我们要讲的是crond服务,对应的命令是crontab命令。
crond 服务是 Linux 下用来周期地执行某种任务或等待处理某些事件的一个守护进程,和 Windows 中的计划任务有些类似。在安装完操作系统后,默认会安装 crond 服务工具,且 crond 服务默认就是自启动的。crond 服务每分钟会定期检查是否有要执行的任务,如果有,则会自动执行该任务。
02 crond配置文件
Linux下的任务调度分为两类,系统任务调度和用户任务调度,其对应的配置文件和目录也各不相同。
系统任务调度
系统任务调度,系统周期性要执行的动作,配置文件为/etc/crontab,该配置为全局性的。
可以看到,该配置文件已经在注释中告诉我们,这个配置文件是系统层面的crontab,与其他crontab不同(即用户任务调度),在编辑此文件和/etc/cron.d/目录中的文件时,不必运行crontab命令。这些文件还额外具有一个用户名字段,但其他crontab都没有。
接着就是一些环境变量的设置。SHELL变量指定使用哪种shell,PATH变量指定系统执行命令的路径。MAILTO变量指定crond的任务执行信息将通过邮件发给哪个用户。HOME变量指定在执行命令或者脚本时使用的主目录。
系统计划任务的语法比较简单,由三部分组成。前面五个星号”*”表示时间:分时日月周;接着就是用户名:以什么身份执行,因为它是全局性的,所以必须指明身份;最后就是要执行的命令command。
在上图中,”run-parts”命令用来执行指定目录中的可执行脚本,这里引生出了四个目录,存放需要定期运行的脚本:
1 | /etc/cron.hourly/:每小时执行的脚本 |
我们以/etc/cron.daily/目录为例,该目录下存放的是每日运行的可执行脚本,其内容就是要执行的命令。(具备执行权限)
另外除了/etc/crontab配置文件,我们还可以在/etc/cron.d/目录中存放系统层面的crontab文件。(不具备执行权限,注意和上面四个目录中的文件区分)
两者的语法一致。我们通常不会去修改/etc/crontab文件,而是去操作/etc/cron.d/目录下的crontab文件。该目录下的计划任务,相对”run-parts”命令涉及到的四个目录中的计划任务,有更自由的调度。
用户任务调度
用户任务调度,用户自定义的周期性动作,配置文件存放在/var/spool/cron/目录(或子目录/var/spool/cron/crontabs/),文件名与用户名一致。
虽然都是crontab文件,但不能直接对其进行编辑,而是通过运行crontab命令对其进行编辑。
这里提示没有用户自定义的计划任务,在下面的章节,我们会使用crontab命令来创建用户的crontab,同时掌握其语法。
其他文件
除了以上两种,crond服务还涉及以下目录和文件。
1 | /etc/cron.deny:黑名单。如果该文件存在,则其中的用户不允许使用crontab命令 |
语法很简单,每行一个用户名即可。
03 crontab命令使用
crontab命令用于维护每个用户的crontab文件,它的使用比较简单,如下是各选项的用法,我们熟练使用前面四个选项即可。
1 | crontab -e:编辑该用户的crontab,指定crontab不存在时则新建 |
首先是”-u”选项,在不添加该选项时,默认是对当前用户的计划任务进行操作。如下图:当前用户为root,直接使用”-l”选项,提示root没有crontab;添加”-u”选项,则列出指定用户kali的计划任务。(需要注意的是,只有管理员权限才能使用”-u”选项,其他用户使用需要sudo)
由于用户kali也没有计划任务,所以同样提示没有kali的crontab。这里我们需要使用”-e”选项,为用户kali新建计划任务。
在新建计划任务之前,我们需要详细了解用户crontab文件的语法。用户crontab语法和系统crontab语法差不多,只是少了一个用户名字段而已。command部分没啥好讲的,我们重点讲时间的设置。
第五个时间字段,也就是星期字段,数字0和7均代表星期天,还可以用星期的英文来表示星期几。另外,五个时间字段中除了可以使用数字,还可以使用如下几个特殊字符。
1 | 星号(*):代表取值范围内的值(任意/每)。 |
下面我们举例来理解这几个特殊字符的使用场景。
1 | 每分钟执行一次命令 |
特殊字符可以单独使用,也可以组合使用,篇幅关系,就不一一列举,大家学会举一反三。五个字段都是对时间进行操作,只是取值范围和单位不一样而已。
介绍了时间字段的语法,接下来我们使用”-e”选项来为用户新建crontab。
第一次操作时,系统会要求我们选择编辑器,选择自己熟练的编辑器即可;选择之后会进入到crontab文件编辑的界面,我们在文件中按照语法添加计划任务,保存退出即可。(这里我没有放截图,大家敲下命令就知道了)
再次使用”-l”选项,直接列出crontab内容,上面的注释为系统自动生成,只有最后一句是我手工添加的。需要注意的是,不同系统,crontab命令打开的crontab文件内容不一定相同,有的可能没有注释,有的第一次使用可能不需要选择编辑器就直接进入crontab文件编辑界面了。(当然选择哪个编辑器也可以我们人工配置,这里不是我们要讲的知识点)
查看/var/spool/cron/crontabs目录,发现存在一个名为kali的crontab文件。
使用”-r”选项删除用户的crontab,注意该选项直接删除crontab文件,而不是删除其中的某条。因此删除之后,名为kali的crontab文件将从目录中删除。
04 总结
计划任务的配置文件和目录涉及较多,以前没接触过的校友一时半会儿可能无法很好的吸收,大家可以带着以下几个问题去理解记忆。
1 | 问题1:任务调度分哪两种? |
05 免责声明
安全小白团是帮助用户了解信息安全技术、安全漏洞相关信息的微信公众号。安全小白团提供的程序(方法)可能带有攻击性,仅供安全研究与教学之用,用户将其信息做其他用途,由用户承担全部法律及连带责任,安全小白团不承担任何法律及连带责任。