控制shell指令碼執行頻率、解決shell指令碼不能修改環境變數等問題
阿新 • • 發佈:2019-01-22
問題描述:這幾天室友遇到一個麻煩,他寫的一個shell指令碼在事件觸發時總是被執行多次而出錯,他想要控制指令碼的執行次數,即每次觸發僅執行一次就行了。懶得去研究為什麼被多次觸發,希望僅僅在指令碼內部寫幾行程式碼便解決這個問題。下面我向大家介紹一下我想的一種解決辦法。
解決辦法:
1. 創立一個共享檔案,向裡面寫入當前時間戳;
2. 指令碼讀取共享檔案內的時間戳,與當前時間作差;
3. 如果差值小於5秒,則直接退出(exit),如果差值大於5秒,則更新共享檔案內的時間戳,並執行後續程式。
因為對於他這種情況,多次執行是因為事件觸發在極短的時間內多次發生,所以在5秒內僅執行一次是滿足要求的。
下面我貼出shell指令碼
#!/bin/sh file_name = "/mnt/flag" if [ ! -f "$file_name" ]; then touch $file_name last_time=$(date -u +%s) echo $last_time > $file_name else for i in `cat $file_name` do now_time=$(date -u +%s) if [ `expr $((now_time)) - $((i))` -lt 5 ]; then echo "please wait..." exit else echo "update the time" echo $now_time > $file_name echo $now_time fi done fi
這樣,你再在這段程式碼後加入你的程式,它在5s內就不會被重複執行了。
討論
也許你會覺得通過共享檔案來通訊太麻煩,不如用環境變數來得方便,你想的辦法可能會是下面這個樣子
#!/bin/bash if [ ! $LAST_TIME ]; then export LAST_TIME=$(date -u +%s) source test.sh [ $LAST_TIME ] else now_time=$(date -u +%s) if [ `expr $((now_time)) - $(($LAST_TIME))` -lt 5 ]; then echo "please wait..." exit else echo "update the time" export LAST_TIME=$now_time source test.sh [ $LAST_TIME ] echo $now_time fi fi
source後面的test.sh指的是本檔案的檔名。像這樣通過新增環境變數的方式,想要得到一個類似於全域性變數的效果,是不能成功的。這是因為在每個shell啟動的時候,都會繼承其父shell的環境變數到本地,指令碼對環境變數的修改,其生命週期隨此shell執行結束而結束,對其父shell並不能產生影響。
綜上所述,要想在shell指令碼中實現全域性變數的效果,一條可行的方案是使用共享檔案。