cron 是如何判斷@reboot狀態(tài)執(zhí)行

最近有個需求為開機的時候服務(wù)器自動執(zhí)行一次puppet agent -t命令,如何利用puppet管理這一個動作呢盆驹,想到了以下三個方案:

  1. 寫一個sysv風(fēng)格的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統(tǒng)一管理文件/etc/rc.local文件,把puppet agent -t這一操作寫在/etc/rc.local文件里面周瞎,開機的時候會執(zhí)行這個文件的命令
  2. 利用puppet 的cron @reboot功能來實現(xiàn)苗缩,puppet語法如下
# 開機執(zhí)行puppet agent -t操作
    cron { 'excute the puppet agent':
        ensure => present,
        command => '/usr/local/bin/puppet agent -t',
        user => 'root',
        special => 'reboot',
    }

經(jīng)過考慮,第一個方式不太可靠声诸,因為放在/etc/init.d下的腳本執(zhí)行有一定的順序酱讶,如果提前執(zhí)行了puppet agent -t這個命令會出事的,so第一個方式去除双絮;第二個方式浴麻,因為之前線上的/etc/rc.local文件有好幾個版本得问,現(xiàn)在要統(tǒng)一管理起來的風(fēng)險也挺大囤攀,so 也去除;那么就很開心的使用了第三張方式

重點就要說說第三種方式宫纬,有個特別的地方就是利用了cron的一個特性@reboot焚挠,來判斷是否要執(zhí)行這一操作。這時候我就有個疑問漓骚,cron是如何判斷服務(wù)器是否reboot了? 我又想了下是否有以下可能

  • cron這個daemon重啟了就認為服務(wù)器已經(jīng)重啟蝌衔?
  • cron根據(jù)uptime信息來判斷服務(wù)器是否重啟?
  • 捕捉run level的狀態(tài)來判斷服務(wù)器是否重啟蝌蹂?

作為一名it人員當然就是噩斟,寫一個cron條目來測試上述條件是否成立,最后發(fā)現(xiàn)都不能觸發(fā)@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);
            }
        }
    }

這小段代碼你能看出是依據(jù)REBOOT_FILE /var/run/crond.reboot來判斷服務(wù)器是否重啟齐鲤,我們再看/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

上面一寸英文的解釋就是說,開機的時候這個目錄下的文件都要被清除给郊,因此再結(jié)合cron節(jié)選的c代碼我們可以得知是根據(jù)/var/run/crond.reboot此文件的存在與否牡肉。

最后經(jīng)過測試,先把文件/var/run/crond.reboot刪除淆九,再restart cron统锤,則觸發(fā)@reboot操作,有興趣的朋友可以嘗試一下炭庙。

題外話饲窿,debian到底是在哪個步驟來清除/var/run這個目錄的的呢,首先我們可以看到/var/run這個目錄煤搜,是鏈接到/run下面的免绿,再用df命令來看到/run是一個tmpfs(臨時文件系統(tǒng))

這是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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市擦盾,隨后出現(xiàn)的幾起案子嘲驾,更是在濱河造成了極大的恐慌淌哟,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辽故,死亡現(xiàn)場離奇詭異徒仓,居然都是意外死亡,警方通過查閱死者的電腦和手機誊垢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門掉弛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人喂走,你說我怎么就攤上這事殃饿。” “怎么了芋肠?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵乎芳,是天一觀的道長。 經(jīng)常有香客問我帖池,道長奈惑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任睡汹,我火速辦了婚禮肴甸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘囚巴。我一直安慰自己原在,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布文兢。 她就那樣靜靜地躺著晤斩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姆坚。 梳的紋絲不亂的頭發(fā)上澳泵,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音兼呵,去河邊找鬼兔辅。 笑死,一個胖子當著我的面吹牛击喂,可吹牛的內(nèi)容都是我干的维苔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼懂昂,長吁一口氣:“原來是場噩夢啊……” “哼介时!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤沸柔,失蹤者是張志新(化名)和其女友劉穎循衰,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體褐澎,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡会钝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了工三。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迁酸。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖俭正,靈堂內(nèi)的尸體忽然破棺而出奸鬓,到底是詐尸還是另有隱情,我是刑警寧澤段审,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布全蝶,位于F島的核電站闹蒜,受9級特大地震影響寺枉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绷落,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一姥闪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧砌烁,春花似錦筐喳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至管呵,卻和暖如春梳毙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捐下。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工账锹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坷襟。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓奸柬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親婴程。 傳聞我的和親對象是個殘疾皇子廓奕,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Puppet理論定義: Puppet 是一個跨平臺的集中化配置管理系統(tǒng),它使用自有的描述語言,可管理配置文件桌粉、用戶...
    屬于你的世界閱讀 963評論 0 2
  • 1.puppet 是什么 puppet是一個開源的軟件自動化配置和部署工具授段,很多大型IT公司均在使用puppet對...
    milo_e1ce閱讀 4,878評論 0 4
  • Ubuntu的發(fā)音 Ubuntu缘薛,源于非洲祖魯人和科薩人的語言窍育,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲de夢閱讀 99,257評論 9 467
  • Linux定時任務(wù)Crontab命令詳解 linux 系統(tǒng)則是由 cron (crond) 這個系統(tǒng)服務(wù)來控制的宴胧。...
    孫燕超閱讀 1,820評論 0 4
  • 一漱抓、項目目標 搭建一個高可用web集群網(wǎng)站 二、項目規(guī)劃 2.1 ip地址規(guī)劃 2.2 拓撲圖 2.3 相關(guān)說明 ...
    夏日之光閱讀 3,400評論 0 1