shell指令碼單例項互斥

2021-07-05 13:03:40 字數 1564 閱讀 4570

##shell執行指令碼單例項互斥問題

比如說有乙個週期性(cron)備份mysql的指令碼,或者rsync指令碼,如果出現意外,執行時間過長,

很有可能下乙個備份週期已經開始了,當前週期的指令碼卻還沒有執行完,顯然我們都不願意看到這樣的情況發生。其實只要對指令碼自身做一些改動,就可以避免它被重複執行。

#!/bin/bash

lock_name="/tmp/my.lock"

if [[ -e $lock_name ]] ; then

echo "re-entry, exiting"

exit 1

fi### placing lock file

touch $lock_name

echo -n "started..."

### 開始正常流程

### 正常流程結束

### removing lock

rm -f $lock_name

echo "done."

當指令碼開始執行時, 建立 /tmp/my.lock檔案,

這時如果再次執行此指令碼,發現存在my.lock,就退出,

指令碼執行結束時刪除這個檔案。

大多數情況下,這樣做都沒有什麼問題。

意外1) 如果同時執行二次此指令碼, 二個程序都會發現my.lock不存在,然後都可以繼續執行。

意外2) 如果指令碼在執行過程中意外退出, 沒有來得及刪除 my.lock檔案, 那麼就悲劇了。

修改如下:

#!/bin/bash

lock_name="/tmp/my.lock"

if ( set -o noclobber; echo "$$" > "$lock_name") 2> /dev/null; 

then

trap 'rm -f "$lock_name"; exit $?' int term exit

### 開始正常流程

......

### 正常流程結束

### removing lock

rm -f $lock_name

trap - int term exit

else

echo "failed to acquire lockfile: $lock_name." 

echo "held by $(cat $lock_name)"

exit 1

fiecho "done."

set -o noclobber 的意思:

if set, bash does not overwrite an existing file with the >, >&, and <> redirection operators.

這樣就能保證my.lock只能被乙個程序建立出來。比touch靠譜多了。

int 用來處理 ctrl+c取消指令碼執行的情況。

term 用來處理 kill -term pid 的情況。

exit 不清楚

另外,對於 kill -9 無效。。

還記得n年前,在php群裡面,草人也問過這個問題,

我們給的答案是 ps aux|grep filename |wc -l ,哈哈,真2。

shell指令碼互斥鎖

指令碼防止同時執行兩個例項的互斥鎖 以下是主要寫法。檢查鎖檔案是否存在,如果存在表示系統中有其他例項在執行,則直接退出。需要注意的是,鎖檔案需要避免重名,建議指令碼名稱.file f tmp lock.file exit 開始執行任務前,建立鎖檔案,並把當前pid 寫入鎖檔案 echo tmp lo...

Shell指令碼互斥設定

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

shell指令碼例項

1.批量建立10個系統賬號test01 test10,並隨機設定8位數密碼 bin bash for i in seq w 10 do useradd test i echo random madsum cut c 8 tee a passwd.txt stdin test i done 2.在目錄...