Linux系统下的定时任务Crontab

时间:2022-11-01 08:00:37
  • 什么是Crontab
Crontab是Linux系统下的定时任务工具,相当于WIN7系统的任务计划,能够让系统定时做出详见 Cron
  • Crontab能用来做什么
Crontab能用来添加Linux或者Unix系统中的定时任务,让系统定时执行某个命令,比如服务器的数据库需要每天凌晨重启下,不可能每天凌晨起来手动重启。可以用Crontab添加凌晨5点重启数据库的定时任务,系统到每天凌晨5点就会自动重启数据了。
Crontab能做的事情还很多,比如定时发送邮件,定时检验库存,定时清理日志,定时备份数据库,总之只要是具有周期性执行的任务基本都可以用Crontab来实现,当然前提在Linux系统环境下。
  • Crontab简单使用
1.常用基本命令
crontab -l   列出当前登录用户所有定时任务
crontab -l -u XXX  列出XXX用户的所有定时任务,如有没有会提示 no crontab for XXX
crontab -e  编辑当前用户的定时任务
crontab -r   删除当前用户的定时任务
2.定时任务的时间设置
* * * * *               每分钟执行
*/1 * * * *            每分钟执行
0 5 * * *                每天五点执行
0-59/2 * * * *        每隔两分钟执行,且是偶数分钟执行,比如2,4,6
1-58/2 * * * *         每隔两分钟执行,且是奇数分钟执行,比如3,5,7
0 0 1,5,10 * *        每个月1号,5号,10号执行
0 0 1-5 * *            每个月 1到5号执行
3.Demo
(1)执行命令: crontab -e 

(2)输入 * * * * * date >> /tmp/date.log
(3)保存后,系统会提示crontab: installing new crontab

(4)执行命令: tail -f /tmp/date.log 就能看到系统每分钟都会打印出时间到date.log这个文件



  • 用Crontab+Shell实现实时监控系统
在系统网站的运营过程中,我们需要知道网站或者系统是否24小时在正常运行,一般系统正常运作需要两个东西在支持,一个是web服务器,一个是数据库。
那么我们就需要实时的监控web服务器和数据库是否在运行。下面我们以apache服务器和mysql数据库作为例子来分析如何实现需求。
1.监控mysql数据库是否正常运行
正常情况我们登录一台Linux服务器后,想要查看当前服务器Mysql是否在运行,我们会执行 pgrep mysql查看,如果有打印出进程ID说明mysql是正常在运行的。
根据这个原理可以写出如下SHELL脚本:
#!/bin/bash
check=`pgrep mysql`
if [ -n "$check" ]; then
    exit
else
   date=$(date +"%Y-%m-%d %H:%M:%S")
   /etc/init.d/mysqld restart
   echo 'mysqld exception at' $date 'and restart '
fi

判断是否存在进程 mysql,存在则正常不存在则说明mysql可能挂了,可以执行重启操作,当然你也可以直接发送邮件到指定邮箱。
2.监控apache是否正常运行根据监控mysql的经验,我们可以这样写SHELL脚本:
#!/bin/bash
check=`pgrep httpd`
if [ -n "$check" ]; then 
  exit
else 
  date=$(date +"%Y-%m-%d %H:%M:%S")
  /etc/init.d/httpd restart 
  echo 'apache exception at' $date 'and restart '
fi



还有种可能是apache可能不在同一台服务器上,则可以用下面的SHELL脚本实现:
if curl -m 10 -G localhost:81 > /dev/null 2>&1
then
      echo 'server is running'
else
      if ping -c 1 localhost > /dev/null 2>&1
      then
         echo 'server exception but ip ping success'
      fi
fi

原理类似于直接访问URL判断是否有响应,分别判断apache端口和服务器IP。如果系统访问无响应有可能是apache服务挂了,还有一种可能是服务器挂了,所以用PING 的方式来判断服务器是否正常。
最后一步,就是把以上两个脚本添加到定时任务中去执行:
crontab -e
* * * * * sh /alidata/test/mysqlListener.sh >> /var/log/mysqlL.log
* * * * * sh /alidata/test/httpdListener.sh >> /var/log/httpdL.log
这样就每分钟都会去判断apache和mysql是否正常运行,基本达到实时监控,如果加上邮件通知的话,只要系统出现故障,一分钟之内就能收到邮件通知。




注:如果想设置crontab 定时任务又不想在 crontab l 这样的命令下显示出来,
可以在 /etc/crontab 这个文件里直接写定时任务,这个文件里的定时任务系统会执行,
但是用crontab l 和 crontab e 的命令看不到