设为首页 收藏本站
查看: 366|回复: 0

[经验分享] Linux下设置定期执行脚本

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-7-21 08:52:21 | 显示全部楼层 |阅读模式
  下面针对的是非ubuntu环境,会在文章末尾介绍ubuntu的一些区别。    在Linux下,经常需要定期的执行一些脚本从而来实现一些功能。
    在Linux下我们用crontab来实现定期的执行脚本这个功能,下面就介绍一下crontab的使用。以及我遇到的一些问题


一. crontab的使用说明
     1. crond 是linux用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。crond命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。而linux任务调度的工作主要分为以下两类

         a. 系统执行的工作,比如垃圾清理,备份
         b. 用户自定义的工作,比如每5分钟执行一次脚本


     2. crontab是UNIX系统下定期执行任务的触发器。用户把要定期执行的任务记录在这个文件下面,然后crond定期的去检查这个定期执行列表,有要执行的工作时便自动执行。
         通过man crontab可以查看到下面的信息
         a. /etc/crond.allow 表示的是允许使用crontab的用户列表
         b. /etc/crond.deny 表示的是不允许使用crontab的用户列表
         
     3. crontab常用的几个命令格式
         crontab -l   //显示用户的crontab文件的内容
         crontab -e  //编辑用户的crontab文件的内容
         crontab -r   //删除用户的crontab文件


    4. crontab文件的基本格式如下所示
        *      *       *       *        *       command
       分    时     天     月     周           命令
       每列表示意义
       a. 第一个*表示的是分钟1~59分钟,默认*表示的是每分钟都执行,x-y表示的是x~y这段每分钟都执行,*/n表示每n分钟执行一次,x,y,z表示的是x,y,z分钟都执行。
       b. 第二个*表示的是小时1~23小时,默认*表示的是每小时都执行,x-y表示的是x~y这段每小时都执行,*/n表示每n小时执行一次,x,y,z表示的是x,y,z小时都执行。
       c. 第三个*表示的是天1~31,默认*表示的是每天都执行,x-y表示的是x~y这段每天都执行,*/n表示每n天执行一次,x,y,z表示的是x,y,z天都执行。
       d. 第四个*表示的是月1~12,默认*表示的是每个月都执行,x-y表示的是x~y这个段每月都执行,*/n表示每n分钟执行一次,x,y,z表示的是x,y,z天都执行。
       e. 第五个*表示的是周0~6(0表示周天),默认周一~周天都执行,x-y表示周x~周y每天都执行。


     5. crontab文件的一些例子
         a. 30 21 * * * /usr/local/etc/rc.d/lighttpd restart             //表示每天21:30重启apache
         b. 45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart    //表示每月1,10,22号4:45重启apache
         c. 0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart    //表示每天18 : 00至23 : 00之间每隔30分钟重启apache
         d. * */1 * * * /usr/local/etc/rc.d/lighttpd restart              //表示每一小时重启apache
         e. */5 * * * * /usr/local/etc/rc.d/lighttpd restart              //表示每5分钟重启apache


二. 具体例子
      1. 首先我在/home/chenguolin/tmp/ 创建一个shell脚本名为s.sh。注意脚本内部的路径使用绝对路径。
          这个脚本的功能就是把当前的日期输出重定向到当前目录下的out文件


      2. 然后设置每2分钟执行一次这个脚本,>/dev/null 2>&1。原因是因为系统会在每次执行完任务之后就发一个邮件告诉用户,通过这个操作可以把信息全部重定向到/dev/null中,/dev/null这个文件类似回收站过一段时间系统自动清理。
          */2 * * * * sh /home/chenguolin/tmp/s.sh >/dev/null 2>&1
          然后发现过了n个2分钟,out文件根本就没有输出。
      
      3. 在谷歌/百度无果之后,问了同事,得到了原因是因为crontab可能有时候没有办法执行用户家目录下面的两个文件,分别是.bashrc和.bash_profile
          这两个文件的作用如下
          .bashrc作用是用于你的bash shell的bash信息,当登录时及每次打开新的shell时,该文件被读取;
          .bash_profile作用是每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件,
          因此我们要手动在crontab文件中添加source /home/chenguolin/.bashrc && source /home/chenguolin/.bash_profile
          source的作用是当前bash环境下执行命令,而scripts是启动一个子shell来执行命令。这样如果把设置环境变量(或alias等等)的命令写进scripts中,就只会影响子shell,无法改变当前的BASH,所以通过文件(命令列)设置环境变量时,要用source 命令。
          因此crontab文件中变成
          */2 * * * * source && /home/chenguolin/.bashrc && source /home/chenguolin/.bash_profile && sh /home/chenguolin/tmp/s.sh >/dev/null 2>&1
      
       4. 发现可以定时的执行脚本。
           如果还不行,那只能通过查找log来查错。非ubuntu的Linux crond的日志文件保存在/var/log下

三. ubuntu下使用crontab定时执行脚本
      注意下几个问题以
      1. ubuntu下crontab的服务程序是cron,并且默认cron服务的log是没有的,我们必须手动开启
          a. sudo vim /etc/rsyslog.d/50-default.conf
          b. 找到cron.*那一行把注释去掉
          c. 然后重启cron服务  sudo service cron restart
          d. 这样就可以在/var/log里面发现有cron的日志文件了,我们就可以通过查看日志文件找到问题所在
      2. ubuntu下,用户家目录下是没有.bash_profile文件的,并且会自动去执行.bashrc文件,只要写成下面这样即可
          */2 * * * * sh /home/chenguolin/tmp/s.sh >/dev/null 2>&1
   



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-22397-1-1.html 上篇帖子: 实现一个做双向NAT的虚拟网卡 下篇帖子: CentOS 中使用yum出现的“UnicodeDecodeError: 'ascii' codec”问题解决方法 Linux
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表