linux使用flock文件鎖解決腳本重復(fù)執(zhí)行問題

關(guān)于forck

  • flock 是對(duì)于整個(gè)文件的建議性鎖。也就是說,如果一個(gè)進(jìn)程在一個(gè)文件(inode)上放了鎖,那么其它進(jìn)程是可以知道的欺嗤。(建議性鎖不強(qiáng)求進(jìn)程遵守。)最棒的一點(diǎn)是卫枝,它的第一個(gè)參數(shù)是文件描述符煎饼,在此文件描述符關(guān)閉時(shí),鎖會(huì)自動(dòng)釋放校赤。而當(dāng)進(jìn)程終止時(shí)吆玖,所有的文件描述符均會(huì)被關(guān)閉。

應(yīng)用場(chǎng)景

linux的crontab命令马篮,可以定時(shí)執(zhí)行操作沾乘,最小周期是每分鐘執(zhí)行一次。現(xiàn)在有個(gè)問題浑测,如果設(shè)定了任務(wù)每2分鐘執(zhí)行一次翅阵,但有可能執(zhí)行該任務(wù)需要花費(fèi)10分鐘,這時(shí)系統(tǒng)會(huì)再執(zhí)行任務(wù)。導(dǎo)致兩個(gè)相同的任務(wù)在執(zhí)行掷匠。這種情況下可能會(huì)出現(xiàn)一些并發(fā)問題读慎,嚴(yán)重時(shí)會(huì)導(dǎo)致出現(xiàn)臟數(shù)據(jù)/性能瓶頸的惡性循環(huán)。
通過使用flock建立排它鎖可以規(guī)避這個(gè)問題槐雾,如果一個(gè)進(jìn)程對(duì)某個(gè)加了排他鎖夭委,則其它進(jìn)程無法加鎖,可以選擇等待超時(shí)或馬上返回募强。

  • 例如
    cat /opt/sleep.sh
#!/bin/bash
# Description: test for file flock
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo ""
echo "----------------------------------"
echo "start at `date '+%Y-%m-%d %H:%M:%S'` ..."
sleep 600s
echo "finished at `date '+%Y-%m-%d %H:%M:%S'` ..."
  • 設(shè)置計(jì)劃任務(wù)每2分鐘執(zhí)行
2/* * * * *  /opt/sleep.sh >> /tmp/sleep.log

而實(shí)際情況是10分鐘后我們查看進(jìn)程ps aux|grep sleep.sh 可以看到有5個(gè)進(jìn)程在運(yùn)行,我們則希望執(zhí)行完上一任務(wù)株灸,再執(zhí)行下一任務(wù),如果上一任務(wù)未執(zhí)行完成擎值,則這次的任務(wù)不執(zhí)行慌烧,直到下一周期再判斷,如果上一任務(wù)執(zhí)行完成鸠儿,則可以執(zhí)行下一任務(wù)屹蚊。

改進(jìn)方法

我們可以使用一個(gè)鎖文件,來記錄任務(wù)是否執(zhí)行中进每。
首先判斷/tmp/sleep.lock是否存在汹粤,如果不存在,則創(chuàng)建田晚,然后執(zhí)行任務(wù)嘱兼,任務(wù)執(zhí)行完后刪除鎖文件。如果鎖文件已經(jīng)存在贤徒,則退出這次的任務(wù)芹壕。這樣的確可以保證任務(wù)執(zhí)行其間不會(huì)有新任務(wù)執(zhí)行,但這樣需要在任務(wù)文件中寫代碼做判斷接奈,不方便踢涌。能不能把任務(wù)鎖定的判斷放在任務(wù)以外呢?

使用linux flock 文件鎖實(shí)現(xiàn)任務(wù)鎖定序宦,解決沖突

格式

flock [-sxun][-w #]
flock [-sxon][-w #] file [-c] command

選項(xiàng)

-s, --shared:    獲得一個(gè)共享鎖
-x, --exclusive: 獲得一個(gè)獨(dú)占鎖/排他鎖
-u, --unlock:    移除一個(gè)鎖睁壁,通常是不需要的,腳本執(zhí)行完會(huì)自動(dòng)丟棄鎖
-n, --nonblock:  如果沒有立即獲得鎖挨厚,直接失敗而不是等待
-w, --timeout:   如果沒有立即獲得鎖堡僻,等待指定時(shí)間
-o, --close:     在運(yùn)行命令前關(guān)閉文件的描述符號(hào)。用于如果命令產(chǎn)生子進(jìn)程時(shí)會(huì)不受鎖的管控
-c, --command:   在shell中運(yùn)行一個(gè)單獨(dú)的命令
-h, --help       顯示幫助
-V, --version:   顯示版本
-w 等待時(shí)間,秒

獨(dú)占鎖/排他鎖

  • 設(shè)置鎖
    使用計(jì)劃任務(wù)執(zhí)行sleep.sh疫剃,文件鎖使用獨(dú)占鎖,如果鎖定則失敗不等待硼讽。這樣當(dāng)任務(wù)未執(zhí)行完成巢价,下一任務(wù)判斷到/tmp/mytest.lock被鎖定,則結(jié)束當(dāng)前的任務(wù),下一周期再判斷壤躲。參數(shù)為-xn
2/* * * * * flock -xn /tmp/sleep.lock -c /opt/sleep.sh >> /tmp/sleep.log
  • 創(chuàng)建獨(dú)占鎖/排他鎖城菊,加上等待超時(shí)/秒
    啟動(dòng)的定時(shí)任務(wù)等待了20秒后,上一個(gè)任務(wù)釋放了鎖碉克,任務(wù)可以馬上拿到鎖凌唬,并繼續(xù)執(zhí)行
2/* * * * * flock -x -w 20 /tmp/sleep.lock -c /opt/sleep.sh >> /tmp/sleep.log
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市漏麦,隨后出現(xiàn)的幾起案子客税,更是在濱河造成了極大的恐慌,老刑警劉巖撕贞,帶你破解...
    沈念sama閱讀 223,207評(píng)論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件更耻,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡捏膨,警方通過查閱死者的電腦和手機(jī)秧均,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來号涯,“玉大人目胡,你說我怎么就攤上這事×纯欤” “怎么了讶隐?”我有些...
    開封第一講書人閱讀 170,031評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)久又。 經(jīng)常有香客問我巫延,道長(zhǎng),這世上最難降的妖魔是什么地消? 我笑而不...
    開封第一講書人閱讀 60,334評(píng)論 1 300
  • 正文 為了忘掉前任炉峰,我火速辦了婚禮,結(jié)果婚禮上脉执,老公的妹妹穿的比我還像新娘疼阔。我一直安慰自己,他們只是感情好半夷,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,322評(píng)論 6 398
  • 文/花漫 我一把揭開白布婆廊。 她就那樣靜靜地躺著,像睡著了一般巫橄。 火紅的嫁衣襯著肌膚如雪淘邻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,895評(píng)論 1 314
  • 那天湘换,我揣著相機(jī)與錄音宾舅,去河邊找鬼统阿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛筹我,可吹牛的內(nèi)容都是我干的扶平。 我是一名探鬼主播,決...
    沈念sama閱讀 41,300評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼蔬蕊,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼结澄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起岸夯,我...
    開封第一講書人閱讀 40,264評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤麻献,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后囱修,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赎瑰,經(jīng)...
    沈念sama閱讀 46,784評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,870評(píng)論 3 343
  • 正文 我和宋清朗相戀三年破镰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了餐曼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,989評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鲜漩,死狀恐怖源譬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情孕似,我是刑警寧澤踩娘,帶...
    沈念sama閱讀 36,649評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站喉祭,受9級(jí)特大地震影響养渴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泛烙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,331評(píng)論 3 336
  • 文/蒙蒙 一理卑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蔽氨,春花似錦藐唠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至自赔,卻和暖如春妈嘹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背匿级。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評(píng)論 1 275
  • 我被黑心中介騙來泰國(guó)打工蟋滴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留染厅,地道東北人痘绎。 一個(gè)月前我還...
    沈念sama閱讀 49,452評(píng)論 3 379
  • 正文 我出身青樓津函,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親孤页。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尔苦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,995評(píng)論 2 361

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