美文网首页我用 Linux技术文
cron 是如何判断@reboot状态执行

cron 是如何判断@reboot状态执行

作者: raingolee | 来源:发表于2015-12-04 17:58 被阅读1997次

    最近有个需求为开机的时候服务器自动执行一次puppet agent -t命令,如何利用puppet管理这一个动作呢,想到了以下三个方案:

    1. 写一个sysv风格的shell script放在/etc/init.d/目录下,然后用puppet的官方常用类型资源service来定制开机启动此脚本,譬如,脚本为/etc/init.d/runppagent.sh,puppet的语法如下
        file { '/etc/init.d/runppagent':
            ensure => 'present',
            owner  => 'root',
            group  => 'root',
            mode   => '0755',
            source => "puppet:///modules/项目代号/runppagent",
        }
        service { 'runppagent': #这里要注意的是此资源一定要在/etc/init.d/目录下
            enable => true,
        }
    
    1. 利用puppet统一管理文件/etc/rc.local文件,把puppet agent -t这一操作写在/etc/rc.local文件里面,开机的时候会执行这个文件的命令
    2. 利用puppet 的cron @reboot功能来实现,puppet语法如下
    # 开机执行puppet agent -t操作
        cron { 'excute the puppet agent':
            ensure => present,
            command => '/usr/local/bin/puppet agent -t',
            user => 'root',
            special => 'reboot',
        }
    

    经过考虑,第一个方式不太可靠,因为放在/etc/init.d下的脚本执行有一定的顺序,如果提前执行了puppet agent -t这个命令会出事的,so第一个方式去除;第二个方式,因为之前线上的/etc/rc.local文件有好几个版本,现在要统一管理起来的风险也挺大,so 也去除;那么就很开心的使用了第三张方式

    重点就要说说第三种方式,有个特别的地方就是利用了cron的一个特性@reboot,来判断是否要执行这一操作。这时候我就有个疑问,cron是如何判断服务器是否reboot了? 我又想了下是否有以下可能

    • cron这个daemon重启了就认为服务器已经重启?
    • cron根据uptime信息来判断服务器是否重启?
    • 捕捉run level的状态来判断服务器是否重启?

    作为一名it人员当然就是,写一个cron条目来测试上述条件是否成立,最后发现都不能触发@reboot这个操作,那么我们就来看看源代码吧,因为the code will tell u everything,(虽然自己写代码很菜

    #ifdef DEBIAN
    #define REBOOT_FILE "/var/run/crond.reboot"
        /* Run on actual reboot, rather than cron restart */
        if (access(REBOOT_FILE, F_OK) == 0) {
                /* File exists, return */
                    log_it("CRON", getpid(),"INFO",
                   "Skipping @reboot jobs -- not system startup");
                return;
        }
        /* Create the file */
        if ((rbfd = creat(REBOOT_FILE, S_IRUSR&S_IWUSR)) < 0) {
            /* Bad news, bail out */
                log_it("CRON",getpid(),"DEATH","Can't create reboot check file");
            exit(0);
        } else {
            close(rbfd);
            log_it("CRON", getpid(),"INFO", "Running @reboot jobs");
        }
    
    
            Debug(DMISC, ("[%d], Debian running reboot jobs\n",getpid()));
    
    #endif
            Debug(DMISC, ("[%d], vixie running reboot jobs\n", getpid()));
        for (u = db->head;  u != NULL;  u = u->next) {
            for (e = u->crontab;  e != NULL;  e = e->next) {
                if (e->flags & WHEN_REBOOT) {
                    job_add(e, u);
                }
            }
        }
    

    这小段代码你能看出是依据REBOOT_FILE /var/run/crond.reboot来判断服务器是否重启,我们再看/var/run这个目录的官方说法,抽我

    This directory contains system information data describing the system since it was booted. Files under this directory must be cleared (removed or truncated as appropriate) at the beginning of the boot process. Programs may have a subdirectory of /var/run

    上面一寸英文的解释就是说,开机的时候这个目录下的文件都要被清除,因此再结合cron节选的c代码我们可以得知是根据/var/run/crond.reboot此文件的存在与否。

    最后经过测试,先把文件/var/run/crond.reboot删除,再restart cron,则触发@reboot操作,有兴趣的朋友可以尝试一下。

    题外话,debian到底是在哪个步骤来清除/var/run这个目录的的呢,首先我们可以看到/var/run这个目录,是链接到/run下面的,再用df命令来看到/run是一个tmpfs(临时文件系统)

    这是debian手册给出的解释
    After mounting all the filesystems, temporary files in "/tmp", "/var/lock", and "/var/run" are cleaned for each boot up.

    root@cc-unknown23344:/etc/init.d# ls -l /var/run
    lrwxrwxrwx 1 root root 4  4月 16  2013 /var/run -> /run
    
    root@cc-unknown23344:/etc/init.d# df -h /run
    Filesystem      Size  Used Avail Use% Mounted on
    tmpfs            26G  180K   26G   1% /run
    

    相关文章

      网友评论

        本文标题:cron 是如何判断@reboot状态执行

        本文链接:https://www.haomeiwen.com/subject/wbushttx.html