2011-11-22 91 views
1

所以我需要一個bash腳本來顯示腳本運行的次數。我顯然需要一個環境變量,但我很難解決這個問題。注意:這是在一個CGI文件中的Web服務器上,我基本上希望它計算「頁面」加載的次數(一個計數器)。Bash Script to Count腳本運行次數

感謝您的幫助!

回答

2

一個環境變量(像真正的CGI中的任何變量)不會真正切割它,因爲腳本終止後這些數據會丟失。

存儲計數最常用的方法是通過您的語言提供的調用來使用數據庫(如DBI for Perl);您的網站提供商應該提供一些這樣的方法。

我想你可以實際執行一個客戶端來連接並查詢數據庫就像你從命令行。

缺乏這一點,假設劇本有寫權限到某個目錄在機器上,你可以將它保存到一個文件:

#!/bin/bash 

file="magic_path/count.cnt" 

if [ -e ${file} ]; then 
    count=$(cat ${file}) 
else 
    count=0 
fi 

((count++)) 

echo ${count} > ${file} 

echo Loaded ${count} times 

記住,這樣的腳本可能會有錯誤,你(或我)可能忽略了。值得注意的是@James_R_Ferguson在下面的評論,指出我的例子中的race condition

+3

嚴格地說,這裏有一個一流的比賽條件。爲了正確的計數,你需要一個專用鎖來防止計數器文件。 – JRFerguson

+0

輝煌的一點;我想不出一種方法來做到這一點,假設你需要處理的只是孤獨的CGI腳本而沒有後端。 – gamen

+0

@garmen:我想,使用Fcntl模塊的一個簡單的Perl腳本和獨佔的鎖定應該就足夠了。 – JRFerguson

2

這裏有幾個選項:

  1. 嘗試羊羣。請參閱manpage for details
  2. 在固定位置創建臨時目錄並將其用作鎖,因爲目錄創建是原子化的。
  3. 如果你能保證當你真正檢查計數時沒有別的東西會運行,那麼你可以附加到一個文件來增加計數:echo -n . >> $LOGFILE。然後,您可以(同時保證沒有其他人訪問它)檢查文件的大小以確定實際計數。

的#2一個例子:

TEMPDIR_LOCK=/path/to/fixed/lock/dir 
mkdir $TEMPDIR_LOCK 
while [[ $? != 0 ]] ; do 
    # sleep, usleep, or busy loop 
    mkdir $TEMPDIR_LOCK; 
done 

# read and increment count in some file 

rm -f $TEMPDIR_LOCK 
+0

非常好。我不知道Linux的flock(),並且會使用Perl。 – JRFerguson