
我正在嘗試編寫兩個腳本。但是當我試圖阻止其中任何一個連續運行兩次時,我遇到了問題。例如,我有 script1 和 script2。我希望當且僅在自上次運行 script1 以來運行 script2 時才能運行 script1。有任何想法嗎?
答案1
在腳本 A 中,查看某個檔案是否存在,如果不存在,請觸碰 /tmp 目錄中的檔案(例如:touch /tmp/script.lock
)並執行程式碼。然後在腳本B中檢查該檔案是否存在。如果該檔案存在,則執行腳本主體,然後刪除該檔案。
腳本A:
if [ ! -f /tmp/script.lock ]
then
echo hello
touch /tmp/script.lock
fi
腳本B:
if [ -f /tmp/script.lock ]
then
echo hello
rm /tmp/script.lock
fi
答案2
讓每個腳本檢查某個檔案(例如/var/tmp/script1-2
)。
如果檢查文件不存在,請儘早將其他腳本的名稱寫入該文件,以防止該腳本運行時它也運行。
如果它存在並且包含自己的名稱,則退出。否則運作正常。
在退出之前,每個腳本都應將自己的名稱寫入檔案中。
CHECKFILE="/var/tmp/script1-2"
MYNAME='script1'
OTHERNAME='script2'
[ ! -s "$CHECKFILE" ] && echo "$OTHERNAME" > "$CHECKFILE"
[ -s "$CHECKFILE" ] && grep -qwF "$MYNAME" && exit 1
# rest of script here
.
.
echo "$MYNAME" > "$CHECKFILE"
選項grep
有:
-q
為了安靜,不產生輸出-w
僅用於匹配整個單字-F
用於匹配固定字串,而不是正規表示式。
注意:如果兩個腳本都運行在確切地同時且 $CHECKFILE 還不存在,那麼它們都會運作。無論哪一個最後完成(需要更多時間運行),其名稱最終都會寫入 $CHECKFILE 中。為了防止這種情況,請echo script2 > /var/tmp/script1-2
在運行它們中的任何一個之前運行。
答案3
一種選擇是在腳本1 中執行“date”命令並將此輸出重定向到某個文件,例如“file.txt”,然後腳本2 可以讀取此“file.txt”並在該文件之間進行“日期”比較日期和腳本 2 運行的日期? 「日期」比較應該相對容易進行 - 網路上有很多範例(我相信)。值得深思。
另一個選擇(取決於您的要求)當然是新增「cron」作業條目。
答案4
如果您只想知道 script2 之前是否有執行過,請執行以下操作:
在 script2 中的任意位置執行以下操作:
touch .ran_already
。
現在在 script1 中執行以下操作:
if [ -f .ran_already ] then Here comes what the script does.. rm -f .ran_already else echo "script2 didn't run yet!" fi
這對你有好處,儘管它又快又髒。