shell指令碼互斥鎖

2021-08-17 01:47:14 字數 901 閱讀 8375

指令碼防止同時執行兩個例項的互斥鎖

以下是主要寫法。

# 檢查鎖檔案是否存在,如果存在表示系統中有其他例項在執行,則直接退出。

# 需要注意的是,鎖檔案需要避免重名,建議指令碼名稱.file

[ -f /tmp/lock.file ] && exit

# 開始執行任務前,建立鎖檔案,並把當前pid 寫入鎖檔案

echo $$ > /tmp/lock.file

sleep 1

# 判斷鎖檔案中的pid 和當前pid 是否相同 ,如果不同則退出

[ "x$(cat /tmp/lock.file)" == "x"$$ ] || exit

# 執行任務,這裡新增你的指令碼邏輯

sleep 60

# 刪除鎖檔案

rm -f /tmp/lock.file

更新一下:

以前的寫法其實有點問題,萬一指令碼執行的時候機器關閉了,或者指令碼執行提前退出,就執行不到刪除鎖檔案了。

下面的邏輯會更加嚴謹,即先檢查pid檔案在不在,如果在,檢查當前是否有同名指令碼,並且是以pid檔案中的的pid執行,如果有就退出,如果沒有,就是自身了。再寫pid到本地。

#單例項邏輯

if [ -f /var/run/$.pid ];then

ps -ef|grep -v grep|grep $|awk -f ' ' ''|grep -q "^`cat /var/run/$.pid`$"

if [ $? -eq 0 ];then

exit 1

fifi

echo $$ > /var/run/$.pid

注:$會根據執行的方式獲取到完整絕對路徑,所以$能去掉前面路徑部分,只保留真實指令碼名。

Shell指令碼互斥設定

參考 shell指令碼為了防止同時執行相同的指令碼需要設定互斥鎖 簡單方法,指令碼執行開始生成乙個鎖檔案,如果該鎖檔案存在則代表有人在執行,就退出指令碼 test.sh bin bash lockfile tmp test lock if f then echo someon do the same...

shell指令碼單例項互斥

shell執行指令碼單例項互斥問題 比如說有乙個週期性 cron 備份mysql的指令碼,或者rsync指令碼,如果出現意外,執行時間過長,很有可能下乙個備份週期已經開始了,當前週期的指令碼卻還沒有執行完,顯然我們都不願意看到這樣的情況發生。其實只要對指令碼自身做一些改動,就可以避免它被重複執行。b...

互斥鎖機制,互斥鎖與讀寫鎖區別

互斥鎖 mutex,用於保證在任何時刻,都只能有乙個執行緒訪問該物件。當獲取鎖操作失敗時,執行緒會進入睡眠,等待鎖釋放時被喚醒 讀寫鎖 rwlock,分為讀鎖和寫鎖。處於讀操作時,可以允許多個執行緒同時獲得讀操作。但是同一時刻只能有乙個執行緒可以獲得寫鎖。其它獲取寫鎖失敗的執行緒都會進入睡眠狀態,直...