日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux shell文件锁,shell脚本实现文件锁功能

發(fā)布時間:2025/3/12 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux shell文件锁,shell脚本实现文件锁功能 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.背景

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

2.關(guān)于flock

flock 是對于整個文件的建議性鎖。也就是說,如果一個進程在一個文件(inode)上放了鎖,那么其它進程是可以知道的。(建議性鎖不強求進程遵守。)最棒的一點是,它的第一個參數(shù)是文件描述符,在此文件描述符關(guān)閉時,鎖會自動釋放。而當(dāng)進程終止時,所有的文件描述符均會被關(guān)閉。

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

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

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

flock [-sxun] [-w timeout] fd

選項和參數(shù):

-s,--shared:獲取一個共享鎖,在定向為某文件的FD上設(shè)置共享鎖而未釋放鎖的時間內(nèi),其他進程試圖在定向為此文件的FD上設(shè)置獨占鎖的請求失敗,而其他進程試圖在定向為此文件的FD上設(shè)置共享鎖的請求會成功。

-x,-e,--exclusive:獲取一個排它鎖,或者稱為寫入鎖,為默認項

-u,--unlock:手動釋放鎖,一般情況不必須,當(dāng)FD關(guān)閉時,系統(tǒng)會自動解鎖,此參數(shù)用于腳本命令一部分需要異步執(zhí)行,一部分可以同步執(zhí)行的情況。

-n,--nb, --nonblock:非阻塞模式,當(dāng)獲取鎖失敗時,返回1而不是等待

-w, --wait, --timeout seconds:設(shè)置阻塞超時,當(dāng)超過設(shè)置的秒數(shù)時,退出阻塞模式,返回1,并繼續(xù)執(zhí)行后面的語句

-o, --close:表示當(dāng)執(zhí)行command前關(guān)閉設(shè)置鎖的FD,以使command的子進程不保持鎖。

-c, --command command:在shell中執(zhí)行其后的語句

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

Linux中的例行性工作排程crontab會定時執(zhí)行一些腳本,但腳本的執(zhí)行時間往往無法控制,當(dāng)腳本執(zhí)行時間過長時,可能會導(dǎo)致上一次任務(wù)的腳本還沒執(zhí)行完,下一次任務(wù)的腳本又開始執(zhí)行了。這種情況下可能會出現(xiàn)一些并發(fā)問題,嚴重時會導(dǎo)致出現(xiàn)臟數(shù)據(jù)/性能瓶頸的惡性循環(huán)。

通過使用flock建立排它鎖可以規(guī)避這個問題,如果一個進程對某個加了排他鎖,則其它進程無法加鎖,可以選擇等待超時或馬上返回。測試實例如下:

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)建定時任務(wù):測試排它鎖

復(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啟動的定時任務(wù)由于無法獲取鎖,以失敗而退出執(zhí)行,直到10:26:00才獲取到鎖

finish at 2014-04-10 10:28:21 ...

4.3 測試排它鎖,加上等待超時

復(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啟動的定時任務(wù)等待了20秒后,上一個任務(wù)釋放了鎖,所以此任務(wù)可以馬上拿到鎖,并繼續(xù)執(zhí)行

finish at 2014-04-10 10:33:41 ...

時間: 2014-12-17

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的linux shell文件锁,shell脚本实现文件锁功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。