linux的计划任务(crontab)

Linux的计划任务

linux定时任务的分类(本文主要讲解crontab):

batchat相同,不过它是在系统负载小于0.8的时候执行调度。

image.png

定时任务的作用:

例如,自动在线更新

自动日志分析(日志占用inode而且影响读写性能)

某些后台工作定时执行

定时删除临时文件

需要防范的地方:

1、***程序可能使用工作调度来搜集系统信息

2、很多***是以例行工作被植入的,可以检查/var/log/cron看是否非你设置的cron被执行了

3、部分离职员工会利用计划去做破坏

crond的日志文件/var/spool/cron

image.png

cron的每一项工作都会记录到/var/log/cron这个日志文件中

cron会每分钟都去读取一次/etc/crontab与/var/spool/cron里面的数据

PATH定义变量的执行路径


1、 配置文件   vim /etc/crontab   

 SHELL=/bin/bash    //使用的shell

 PATH=/sbin:/bin:/usr/sbin:/usr/bin   //执行文件查找命令

MAILTO=root   //额外输出,以email将数据发送给谁

        

2、 计划任务存放位置

/var/spool/cron


3、日志文件  查看计划任务是否执行

 /var/log/cron    


4、以下目录内可以存放脚本 该脚本就会按照时间去执行

         /etc/cron.hourly/    每小时  

         /etc/cron.weekly/   每周日

         /etc/cron.daily/       每天  

         /etc/cron.monthly/ 每月1号

5、权限管理

        /etc/cron.deny   黑名单    在此文件中写入的用户不可以使用crond

        /etc/cron.allow   白名单    只有在此文件中写入的用户可以使用crond

注意事项

[root@ansible-db log]# cat /etc/crontab 

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin(请注意:crontab的PATH变量与系统的PATH变量不同,可能会导致部分命令无法使用,crontab执行shell时只能识别为数不多的系统环境变量,解决办法就是要执行的语句都放在脚本中,同时在脚本中声明变量)

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


[root@ansible-db log]# echo $PATH

/usr/local/redis/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin

crontab标准化工作流程

 1、计划任务脚本指定存放位置,便于维护和定期备份  /etc/crontab 

 2、写定时任务前必须在前面写注释,包括以下:

  添加计划任务的人,添加任务的时间,任务有效期,计划任务脚本的对象,脚本的作用,以及其他需要提醒其他注意的事项

 3、执行的脚本前加上/bin/bash或者/bin/sh,脚本必须使用完整的绝对路径

 4、定时任务,需要尽量避免标准输出和标准错误输出 结尾加上 >/dev/null 2>&1.

计划任务的标准输出和标准错误输出都会给root用户以邮件(在配置文件中定义的),很容易撑满磁盘消耗磁盘inode

 5、能用命令完成的也要写在脚本里

 6、在指定用户下执行相关的定时任务

 7、制定标准的书写规范

其他使用注意:

 环境变量问题:计划文物的脚本得环境变量需要在脚本重新定义,可以手动在脚本内加载环境变量的配置文件如

8、定时任务的权限检查(chmod u+x /tmp/b.sh,尽量在脚本前面带上/bin/sh命名,否则有可能因为忘了为脚本设定执行权限)

9、定时任务脚本的检查(sh –x 调试,bash –n检查语法,在各个细小环境减少出错的机会。)

10、先在测试环境中演练

example:

1、报错如下,

/bin/sh: /tmp/20190428.sh: Permission denied

检查脚本权限问题

 

2、每一分钟执行一次脚本

*/1 * * * * sh /tmp/20190428.sh


3、只保留最近1个月的日志文件

crontab -e

1 * * * *  find /var/log -mtime +30 |xarge -i rm -rf {}

或者 -exec rm -rf  {} \;


4、jim用户每天在家目录创建一个以日期命名的目录20170412

crontab -u jim -e

1  0  *  *  *  /bin/mkdir  /home/jim/`date +%Y%m%d`


5、>/dev/null 2>&1的作用

如果定时任务规范结尾不加 >/dev/null 2>&1,很容易导致硬盘inode空间被占满,从而系统服务不正常

(var/spool/clientmqueue邮件临时队列目录,垃圾文件存放于此,如果是centos 6.4系统,默认不装sendmail服务,所以不会有这个目录。)

工作调度出错后会一直发邮件给MAILTO设置的邮箱,可以使用重定向输出到黑洞


1 * * * *是每个整点过一分钟执行



猜你喜欢

转载自blog.51cto.com/zhouyaxiong/2386271