如何編寫一個腳本,僅當另一個腳本最近運行時才運行?

如何編寫一個腳本,僅當另一個腳本最近運行時才運行?

我正在嘗試編寫兩個腳本。但是當我試圖阻止其中任何一個連續運行兩次時,我遇到了問題。例如,我有 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

這對你有好處,儘管它又快又髒。

相關內容