1. 程式人生 > >控制shell指令碼執行頻率、解決shell指令碼不能修改環境變數等問題

控制shell指令碼執行頻率、解決shell指令碼不能修改環境變數等問題

問題描述:這幾天室友遇到一個麻煩,他寫的一個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指令碼中實現全域性變數的效果,一條可行的方案是使用共享檔案。