2011-11-22 95 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