##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.在目錄...