引言
crond 的概念和 crontab 是不可分割的。crontab 是一个命令,而 crond 是Linux 下用来周期性执行某种任务或等待处理某些事件的守护进程,类似于 Windows 下的计划任务。
当装完操作系统之后,默认便会安装 crond 服务工具,并会自动启动 crond 进程,crond 进程每分钟定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
Linux 下的定时任务种类
种类 | 使用场景 |
at | 适合仅执行一次就结束的调度命令,需要启动一个后端的atd服务。 |
crontab | 最常用的定时任务,需要启动一个服务crond才行,crond服务通过crontab命令实现 |
anacron | 无法周期性执行,只能以天为周期,但有个特点,在关机状态下未>执行的任务,下次开机时可以补上执行 |
crontab 工作原理
在 Linux 中,crontab 是最常用的定时任务工具,系统会每分钟循环检查任务列表,默认系统中可以登录的用户,都可以使用 crontab 定义计划任务。另外,还可以通过 /etc/cron.allow 文件来限制权限。
系统任务调度和用户任务调度
crontab 设置定时任务可以分为两类:
系统任务调度:指的是系统级别的周期性任务,如定期写磁盘、日志清理。/etc/crontab 文件就是系统任务调度的配置文件。
用户任务调度:通过 crontab -e 进行编写的任务,都属于用户任务调度,这类任务可以包括:用户数据备份、定时邮件提醒等。Linux 系统会将所有用户设置的定时任务存放到 /var/spool/cron 目录中,文件名与用户名一致:
执行 crontab -r 后,即直接删除用户 crontab 文件:
cron 表达式
【基本含义】
项目 | 含义 | 范围 |
---|---|---|
第一个* | 一小时当中的第几分钟 | 0-59 |
第二个* | 一天当中的第几小时 | 0-23 |
第三个* | 一个月当中的第几天 | 1-31 |
第四个* | 一年当中的第几月 | 1-12 |
第五个* | 一周当中的星期几 | 0-7(0和7 都代表星期日) |
【特殊符号含义】
特殊符号 | 含义 |
* | 任何时间。如第一个 * 代表每分钟都执行。 |
, | 不连续的时间,如:0 8,12 * * * ,表示每天8:00和12:00各执行一次。 |
- | 连续的时间段,如:0 5 * * 1-6,表示每周一到周六的5:00执行。 |
/ | 间隔时间,如:*/10 * * * * , 表示每隔 10 分钟执行一次,不看时间点。 |
crontab 基本应用
【语法】
crontab [-u user] [ -e | -l | -r ]
【常用参数】
-e 编辑 crontab 定时任务
-l 查询crontab 定时任务
-r 删除当前用户所有的 crontab 任务(终止任务调度)
【服务操作】
service crond restart 或 /sbin/service crond restart 重启任务调度服务
service crond stop 关闭服务
service crond start 启动服务
service crond reload 重新载入配置
查看crontab 运行日志
在 /var/log/cron-日期 文件中,可以看到定时任务的执行情况:
应用案例1
【案例要求】将 /etc 目录下的文件列表每分钟追加到 /tmp/to.txt 文件中。
【操作步骤】
1) cron -e
2) */1 * * * * ls -l /etc >>/tmp/to.txt
3)保存退出,即可生效
应用案例2
【案例要求】每天凌晨2点,将mysql数据库testdb,备份到文件mydb.bak中
1)先编写一个脚本文件,/home/mytask3.sh
/usr/local/mysql/bin/mysqldump -u root -proot testdb > /tmp/mydb.bak
2)给mytask3.sh 一个可执行权限
chmod 744 /home/mytask3.sh
3)crontab -e
4)0 2 * * * /home/mytask3.sh
【注意】如果直接执行类似 * * * * * ls /home 或 * * * * * echo 'hello world' 这样的任务,Linux会每分钟发一封邮件给当前用户。保存在 /var/spool/mail/root 中。