婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > shell腳本實(shí)現(xiàn)文件鎖功能

shell腳本實(shí)現(xiàn)文件鎖功能

熱門標(biāo)簽:百度地圖的地圖標(biāo)注 地圖標(biāo)注超出范圍怎么辦 東莞電銷機(jī)器人價(jià)格一覽表 excel地址地圖標(biāo)注 陜西電銷卡外呼系統(tǒng)怎么安裝 杭州機(jī)器人外呼系統(tǒng) 佛山高德地圖標(biāo)注中心 百度地圖標(biāo)注圖標(biāo)更換 旅游地圖標(biāo)注大全

1.背景

當(dāng)多個(gè)進(jìn)程可能會(huì)對(duì)同樣的數(shù)據(jù)執(zhí)行操作時(shí),這些進(jìn)程需要保證其它進(jìn)程沒有在操作,以免損壞數(shù)據(jù)。通常,這樣的進(jìn)程會(huì)使用一個(gè)“鎖文件”,也就是建立一個(gè)文件來(lái)告訴別的進(jìn)程自己在運(yùn)行,如果檢測(cè)到那個(gè)文件存在則認(rèn)為有操作同樣數(shù)據(jù)的進(jìn)程在工作。這樣的問(wèn)題是,進(jìn)程不小心意外死亡了,沒有清理掉那個(gè)鎖文件,那么只能由用戶手動(dòng)來(lái)清理了。

2.關(guān)于flock

flock 是對(duì)于整個(gè)文件的建議性鎖。也就是說(shuō),如果一個(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)閉。

3. shell中實(shí)現(xiàn)flock系統(tǒng)調(diào)用的命令是flock,其使用格式有以下兩種(man flock)


復(fù)制代碼 代碼如下:

flock [-sxon] [-w timeout] lockfile [-c] command...
flock [-sxun] [-w timeout] fd


選項(xiàng)和參數(shù):


-s,--shared:獲取一個(gè)共享鎖,在定向?yàn)槟澄募腇D上設(shè)置共享鎖而未釋放鎖的時(shí)間內(nèi),其他進(jìn)程試圖在定向?yàn)榇宋募腇D上設(shè)置獨(dú)占鎖的請(qǐng)求失敗,而其他進(jìn)程試圖在定向?yàn)榇宋募腇D上設(shè)置共享鎖的請(qǐng)求會(huì)成功。
-x,-e,--exclusive:獲取一個(gè)排它鎖,或者稱為寫入鎖,為默認(rèn)項(xiàng)
-u,--unlock:手動(dòng)釋放鎖,一般情況不必須,當(dāng)FD關(guān)閉時(shí),系統(tǒng)會(huì)自動(dòng)解鎖,此參數(shù)用于腳本命令一部分需要異步執(zhí)行,一部分可以同步執(zhí)行的情況。
-n,--nb, --nonblock:非阻塞模式,當(dāng)獲取鎖失敗時(shí),返回1而不是等待
-w, --wait, --timeout seconds:設(shè)置阻塞超時(shí),當(dāng)超過(guò)設(shè)置的秒數(shù)時(shí),退出阻塞模式,返回1,并繼續(xù)執(zhí)行后面的語(yǔ)句
-o, --close:表示當(dāng)執(zhí)行command前關(guān)閉設(shè)置鎖的FD,以使command的子進(jìn)程不保持鎖。
-c, --command command:在shell中執(zhí)行其后的語(yǔ)句

4. shell中實(shí)現(xiàn)排它鎖避免腳本重復(fù)執(zhí)行

Linux中的例行性工作排程crontab會(huì)定時(shí)執(zhí)行一些腳本,但腳本的執(zhí)行時(shí)間往往無(wú)法控制,當(dāng)腳本執(zhí)行時(shí)間過(guò)長(zhǎng)時(shí),可能會(huì)導(dǎo)致上一次任務(wù)的腳本還沒執(zhí)行完,下一次任務(wù)的腳本又開始執(zhí)行了。這種情況下可能會(huì)出現(xiàn)一些并發(fā)問(wèn)題,嚴(yán)重時(shí)會(huì)導(dǎo)致出現(xiàn)臟數(shù)據(jù)/性能瓶頸的惡性循環(huán)。
通過(guò)使用flock建立排它鎖可以規(guī)避這個(gè)問(wèn)題,如果一個(gè)進(jìn)程對(duì)某個(gè)加了排他鎖,則其它進(jìn)程無(wú)法加鎖,可以選擇等待超時(shí)或馬上返回。測(cè)試實(shí)例如下:

4.1 創(chuàng)建執(zhí)行腳本

復(fù)制代碼 代碼如下:

#cat /scripts/shell/file_lock.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 140s

echo "finished at `date '+%Y-%m-%d %H:%M:%S'` ..."


4.2 創(chuàng)建定時(shí)任務(wù):測(cè)試排它鎖


復(fù)制代碼 代碼如下:

#crontab -e
* * * * * flock -xn /dev/shm/test.lock -c "sh /scripts/shell/file_lock.sh > /root/stdout.log"

每分鐘執(zhí)行一次該腳本,并將輸出信息寫入到stdout.log
 
查看輸出日志如下:
復(fù)制代碼 代碼如下:

----------------------------------
start at 2014-04-10 10:23:01 ...            #獲取鎖
finish at 2014-04-10 10:25:21 ...           #釋放鎖
 
 
----------------------------------
start at 2014-04-10 10:26:01 ...            #10:27:00及10:28:00啟動(dòng)的定時(shí)任務(wù)由于無(wú)法獲取鎖,以失敗而退出執(zhí)行,直到10:26:00才獲取到鎖
finish at 2014-04-10 10:28:21 ...


4.3 測(cè)試排它鎖,加上等待超時(shí)


復(fù)制代碼 代碼如下:

* * * * * flock -x -w 20 /dev/shm/test.lock -c "sh /scripts/shell/file_lock.sh > /root/stdout.log"

查看日志輸出信息:
復(fù)制代碼 代碼如下:

----------------------------------
start at 2014-04-10 10:29:01 ...
finish at 2014-04-10 10:31:21 ...
 
----------------------------------
start at 2014-04-10 10:31:21 ...    #10:31:00啟動(dòng)的定時(shí)任務(wù)等待了20秒后,上一個(gè)任務(wù)釋放了鎖,所以此任務(wù)可以馬上拿到鎖,并繼續(xù)執(zhí)行
finish at 2014-04-10 10:33:41 ...

您可能感興趣的文章:
  • linux shell之文件鎖

標(biāo)簽:通遼 南充 雅安 朝陽(yáng) 延邊 西藏 隨州 青島

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《shell腳本實(shí)現(xiàn)文件鎖功能》,本文關(guān)鍵詞  shell,腳本,實(shí)現(xiàn),文件,鎖,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《shell腳本實(shí)現(xiàn)文件鎖功能》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于shell腳本實(shí)現(xiàn)文件鎖功能的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 甘谷县| 嵊州市| 龙游县| 交城县| 乾安县| 曲水县| 玉溪市| 炉霍县| 霍山县| 德格县| 太谷县| 莱阳市| 扎兰屯市| 侯马市| 太康县| 三台县| 修文县| 玛曲县| 镇赉县| 新龙县| 郑州市| 清徐县| 靖远县| 麻栗坡县| 利辛县| 改则县| 常德市| 博兴县| 大埔区| 周口市| 定安县| 苗栗县| 双柏县| 达日县| 福安市| 晋宁县| 威远县| 民勤县| 沾益县| 榆中县| 静宁县|