判斷shell指令碼是否唯一執行中

2021-10-25 15:59:54 字數 2627 閱讀 4495

背景檔案鎖

flock

總結

shell中的比較不是使用簡單的》 = 《等,而是用擴充套件符

-eq //等於 equal

-ne //不等於 no equal

-gt //大於 great than

-lt //小於 less than

ge //大於等於 great and equal 注意沒有"-"

le //小於等於 less and equal 注意沒有"-"

$$ shell本身的pid(processid)

$! shell最後執行的後台process的pid

$? 最後執行的命令的結束**(返回值)

$0 shell本身的檔名

$1 執行過程中手打輸入傳遞給該shell指令碼的第乙個引數

$2 執行過程中手打輸入傳遞給該shell指令碼的第二個引數

$@ 傳給指令碼的所有引數的列表

--判斷檔案存在

-e filename 如果 filename存在,則為真

-d filename 如果 filename為目錄,則為真

-f filename 如果 filename為常規檔案,則為真

-l filename 如果 filename為符號鏈結,則為真

-r filename 如果 filename可讀,則為真

-w filename 如果 filename可寫,則為真

-x filename 如果 filename可執行,則為真

-s filename 如果檔案長度不為0,則為真

-h filename 如果檔案是軟鏈結,則為真

trap命令:

當bash接收到乙個unix訊號時,執行乙個命令或者乙個函式。比如指令碼執行結束、非正常

退出ctrl+c終止、kill指令碼等。trap命令可以在接受到以上訊號時編寫你要執行的命令。你可以鏈結多個

訊號(列表可以使用kill -l獲得),但是為了清理殘局,我們只使用其中的三個:int,term和exit。

你可以使用-as來讓traps恢復到初始狀態。

int interrupt - 當有人使用ctrl-c終止指令碼時被觸發

term terminate - 當有人使用kill殺死指令碼程序時被觸發

exit exit - 這是乙個偽訊號,當指令碼正常退出或者set -e後因為出錯而退出時被觸發

trap命令一般使用在檔案鎖的場景

trap "rm -f $; exit" int term exi //在以上三個場景時,刪除檔案鎖並且退出指令碼。

如果指令碼執行卡住或者執行異常沒有退出時,繼續執行指令碼會發生未知的錯誤。比如指令碼啟動關閉資料庫、應用等場景。所以在指令碼執行前加上判斷此指令碼是否還在執行就顯得比較重要了。簡單的思路是在指令碼執行前段查詢當前指令碼的程序是否在執行,在執行的話判斷為是。簡單的指令碼如下:

#!/bin/bash

echo $0

ps -ef|grep $0 | grep -v grep

runcount=`ps -ef|grep $0 | grep -v grep -c`

if [ $runcount -ge 1 ]

then

echo -e "example.sh is running,pro_counts:$"

fi

執行上述指令碼後結果如下:

[root@localhost ~]# ./example.sh 

root 1421 25320 0 15:53 pts/1 00:00:00 /bin/bash ./example.sh

example.sh is running,pro_counts:2

可以看到檢視程序後過濾後只有一條,但是程式數量顯示出來卻是2。原因在於,shell指令碼中的ps檢視example相關程序的命令相當於子程序執行了一次,然後當前指令碼也是和example相關的程序,所以會出現兩個。

使用檔案鎖的方式實現單程序指令碼執行。過程如下:

在linux下說到鎖檔案,這裡就不得不提flock命令了。沒有前面的一些巧妙處理,我們很多時候會很難刪除原先建立的鎖檔案,比如:

使用flock來完成檔案鎖指令碼如下:

#!/bin/bash

lock_file=/tmp/test.lock

exec 99>"$lock_file"

flock -n 99

if [ "$?" != 0 ]; then

echo "$0 already running"

exit 1

fi#指令碼要做的其他事情

sleep 1024

檢視flock的man手冊,我們發現它還有乙個例子是這麼做的:

#!/bin/bash

[ "$" != "$0" ] && exec env flocker="$0" flock -en "$0" "$0" "$@" || :

#指令碼要做的其他事情

sleep 1024

如果$環境變數沒有設定,則嘗試將指令碼本身加鎖,如果加鎖成功,則執行當前指令碼,(並且帶上原有的引數),否則的話靜默退出。

判斷指令碼唯一執行的基本總結到此。

shell指令碼判斷某服務是否執行

shell指令碼判斷某服務是否開啟 指令碼如下 bin bash 檢查服務狀態,是否安裝 read p 請輸入要檢測的服務 service netstat anp grep service dev null if eq 0 then echo service服務已經啟動!else rpm q ser...

shell指令碼判斷上乙個命令是否執行成功

shell指令碼中判斷上乙個命令是否執行成功 shell中使用符號 來顯示上一條命令執行的返回值,如果為0則代表執行成功,其他表示失敗。結合if else語句實現判斷上乙個命令是否執行成功。經過驗證,該方法也適用於make命令,並不僅僅限於shell 命令。示例如下 if ne 0 then ech...

Shell指令碼判斷檔案是否存在

例項一 bin sh 判斷檔案是否存在 這裡的 x 引數判斷 mypath是否存在並且是否具有可執行許可權 if x mypath then mkdir mypath fi 這裡的 d 引數判斷 mypath是否存在 if d mypath then mkdir mypath fi 這裡的 f引數判...