网站首页 文章专栏 linux定时任务

linux定时任务

编辑时间:2018-07-03 11:42:38 作者:苹果 浏览量:2483




  1. 查看是否安装crontab

      

     [root]# rpm -qa | grep crontab

      crontabs-1.11-6.20121102git.el7.noarch

  一般都会带有,如过没有,可以yum安装


    2.查找文件目录

    [root]# whereis cron

    cron: /etc/cron.deny /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly /etc/cron.d 

      

        cron.daily是每天执行一次的job

        cron.weekly是每个星期执行一次的job

        cron.monthly是每月执行一次的job

        cron.hourly是每个小时执行一次的job

        cron.d是系统自动定期需要做的任务

        cron.deny文件就是用于控制不让哪些用户使用Crontab的功能

          与这些文件在一起的有个 crontab,是设定定时任务执行文件

    3.查找crond 可执行文件

        [root]# which is crond

        /usr/sbin/crond

  4.进入到crond的目录开启crond服务

       service crond start

    如需加入开机启动,则在开机启动脚本/etc/rc.d/rc.local 加入/sbin/service crond start


 以上是配置,以下是定时任务



         crontab文件格式:

         

          *           *        *        *        *           command

        minute   hour    day   month   week      command

        分          时         天      月        星期       命令


常见几个操作

  1.   * */2 * * * /usr/bin/curl http://www.xxx.com/Home/Auto/test    每两小时请求一次这个网址

  2.   30 21 * * * /usr/local/etc/rc.d/lighttpd restart 表示每晚的21:30重启lighttpd

  3.   45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart 表示每月1、10、22日的4 : 45重启lighttpd

  4.   10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart 表示每周六、周日的1 : 10重启lighttpd

  5.    0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart 表示在每天18 : 00至23 : 00之间每隔30分钟重启lighttpd

  6.    0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart 表示每星期六的11 : 00 pm重启lighttpd

  7.    * */1 * * * /usr/local/etc/rc.d/lighttpd restart 每一小时重启lighttpd

  8.    * 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart 晚上11点到早上7点之间,每隔一小时重启lighttpd

  9.    0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart 每月的4号与每周一到周三的11点重启lighttpd

  10.    0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart 一月一号的4点重启lighttpd

  11.   * 1 * * * /usr/bin/curl -o data/log/txt.txt  http://www.abc.com     将网站内容写入txt.txt文件


  crontab -e 命令,写入相应的语句即可



常见问题及处理办法扩展:

1.防卡死

使用 timeout,假设我们设定每个脚本最多执行时间位 200秒,超过 200秒 就自动死掉。


* * * * * timeout 200 php /home/app/email.php


2.防多次请求

如果这个脚本执行时间超过 60秒,下一分钟又会执行 php email.php,如果避免重复执行?


这样会出现,有两个进程同时在执行 php email.php,那会不会出现同一个任务被执行了两次?


解决办法:


使用 flock 进行互斥控制


用法: flock [选项] <文件|目录> <命令> [<参数>...] flock [选项] <文件|目录> -c <命令> flock [选项] <文件描述符号码>通过 shell 脚本管理文件锁。  选项: -s, --shared             获取共享锁 -x, --exclusive          获取排他锁(默认) -u, --unlock             移除锁 -n, --nonblock           失败而非等待 -w, --timeout <秒>       等待限定的时间 -E, --conflict-exit-code <数字>     冲突或超时后的退出代码 -o, --close              运行命令前关闭文件描述符 -c, --command <命令>      通过 shell 运行单个命令字符串 -F, --no-fork            执行命令时不 fork     --verbose            增加详尽程度 -h, --help               display this help -V, --version            display version


我们用到其中的排他设置


* * * * * flock -xn /tmp/test.lock -c "timeout 200 php /home/app/email.php"


记录好日志


定时任务可能要记录日志呀,不然后期怎么排查


* * * * * flock -xn /tmp/test.lock -c "timeout 200 php /home/app/email.php >> /home/log/test.log 2>&1"






    出自:何冰华个人网站

    地址:https://www.hebinghua.com/

    转载请注明出处


来说两句吧
最新评论