首页 > 技术文章 > Linux定时任务-cronie

zhangfushuai 2021-05-14 11:02 原文

1.cronie服务介绍

Linux crontab(cronie)是用来定期执行程序的命令。

当安装完成操作系统之后,默认就会启动此任务调度命令。

crond 命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。

注意:新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,如果想要立马执行需要重启服务。

而 linux 任务调度的工作主要分为以下两类:

(1)系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存

(2)个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置。

2.软件列表

[root@shuai ~]# rpm -ql cronie
/etc/cron.d
/etc/cron.d/0hourly
/etc/cron.deny
/etc/pam.d/crond
/etc/sysconfig/crond
/usr/bin/crontab      #命令目录
/usr/lib/systemd/system/crond.service
/usr/sbin/crond
/usr/share/doc/cronie-1.4.11
/usr/share/doc/cronie-1.4.11/AUTHORS
/usr/share/doc/cronie-1.4.11/COPYING
/usr/share/doc/cronie-1.4.11/ChangeLog
/usr/share/doc/cronie-1.4.11/INSTALL
/usr/share/doc/cronie-1.4.11/README
/usr/share/man/man1/crontab.1.gz
/usr/share/man/man5/crontab.5.gz
/usr/share/man/man8/cron.8.gz
/usr/share/man/man8/crond.8.gz
/var/spool/cron      #定时任务存放目录

3.定时任务特殊目录

系统定时任务周期:每小时 控制定时任务目录:/etc/cron.hourly ​

系统定时任务周期:每一天 控制定时任务目录:/etc/cron.daily

​ 系统定时任务周期:每一周 控制定时任务目录:/etc/cron.weekly ​

系统定时任务周期:每个月 控制定时任务目录:/etc/cron.monthly

4.编写定时任务

(1)用户定时任务编辑 crontab -e(edit)
crontab -e  编写定时任务  
相当于    vi /var/spool/cron/        定时任务配置文件保存目录
          vi /var/spool/cron/root    root用户设置的定时任务配置文件
          vi /var/spool/cron/shuai   shuai用户设置的定时任务配置文件

说明: 编辑配置定时任务信息

(2)用户定时任务查看 crontab -l(list)

说明: 列表查看定时任务信息

crontab -l

5.定时任务实际编写方法

定时任务环境准备
a.查看服务是否开启
[root@shuai /etc]# systemctl status crond.service   #Centos7
[root@shuai /etc]# /etc/init.d/crond status         #Centos6
b.编写定时任务的语法规范
[root@shuai ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
​
# For details see man 4 crontabs
​
# 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
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

定时任务编写规范

写法:
01.用数值表示时间信息
    00 02 *  *  *   备份文件        #每天的凌晨2点执行
02.利用特殊符号表示时间信息
     *              *               *            *          *   备份文件 
    每分钟          每小时            每天           每月      每周
    PS: 定时任务最短执行的周期为每分钟
    */5                     */5            */5 
   每隔5分钟                 每隔5小时       每隔5天
03.指定的时间范围
    01-05   02    *    *    *      #每天凌晨2点的01-05分都要执行
04.指定不连续的时间信息
    00      14,20    *   *    *    #每天的14点和20点都执行

c.实际编写定时任务
(1)每天凌晨两点备份/data目录到/backup
[root@shuai ~]# crontab -e
​
#每天凌晨两点备份/data目录到/backup
​
00  02 * * *  cp -r /data  /backup/  &>/dev/null
~                   
(2)定时任务排查方法

1.检查是否有定时任务配置文件

[root@shuai ~]# crontab -l
#每天凌晨两点备份/data目录到/backup

00  02 * * *  cp -r /data  /backup  &>/dev/null
[root@shuai ~]# cat /var/spool/cron/root 
#每天凌晨两点备份/data目录到/backup

00  02 * * *  cp -r /data  /backup  &>/dev/null

2.检查定时任务日志文件

[root@shuai ~]# cat /var/log/cron
Jul 17 14:48:39 shuai crontab[2779]: (root) BEGIN EDIT (root)
Jul 17 14:51:11 shuai crontab[2779]: (root) REPLACE (root)
Jul 17 14:51:11 shuai crontab[2779]: (root) END EDIT (root)
Jul 17 14:53:54 shuai crontab[2791]: (root) LIST (root)
执行时间        主机名  编辑/执行定时任务 以什么用户编辑或执行定时任务/做了什么事

6.定时任务编写注意事项:(规范)

(1)编写定时任务要有注释说明
(2)编写定时任务路径信息尽量使用绝对路径
(3)编写定时任务命令需要采用绝对路径执行 /usr/sbin/useradd (which useradd)

命令执行成功条件: ​

useradd —> $PATH —> /sbin/useradd —> 命令执行成功

​ 定时任务执行时,识别的$PATH信息只有: /usr/bin:/bin ​ useradd命令目录为/usr/sbin/useradd

(4)编写定时任务时,可以将输出到屏幕上的信息保存到黑洞中,避免占用磁盘空间

* * * * * sh shuaish &>/dev/null

(5)编写定时任务, 尽量不要产生屏幕输出信息

例如:tar zcvf /backup/data.tar.gz /data 有信息输出 ​ cd / && tar zcf /backup/data.tar.gz ./data 没有信息输出

(6)当需要多个命令完成一个定时任务需求时,可以利用脚本编写定时
[root@shuai ~]# vim backup.sh    
[root@shuai ~]# crontab -e 
   # xxxxx
   * * * * *  /usr/bin/sh /server/scripts/backup.sh &>/dev/null
(7)说明: 定时任务中执行命令,如果产生输出到屏幕的信息,都会以邮件方式告知用户

/var/spool/mail/root 不断变大占用磁盘空间 占用的block空间

 解决方法: 将邮件服务关闭
[root@shuai /backup]#    systemctl stop postfix

发不出去邮件会产生草稿文件

  /var/spool/postfix/maildrop/  不断产生小文件占用磁盘空间  占用的inode空间
  解决方法: 删除小文件
  rm -f /var/spool/postfix/maildrop/*
  systemctl start postfix

 

推荐阅读