Bash Script to Count Количество выполнений скрипта - PullRequest
2 голосов
/ 22 ноября 2011

Так что мне нужен bash-скрипт, который будет отображать количество раз, когда скрипт был запущен. Очевидно, мне нужна переменная окружения, но у меня возникают проблемы с ее выяснением. Примечание: это на веб-сервере в CGI-файле, и я в основном хочу, чтобы он подсчитывал количество загрузок страницы (счетчик).

Спасибо за любую помощь!

Ответы [ 2 ]

3 голосов
/ 22 ноября 2011

Переменная окружения (как и любая другая переменная в CGI) на самом деле ее не обрезает, поскольку эти данные теряются после завершения скрипта.

Самый распространенный способ сохранить счет - использовать базу данных с помощью вызовов, доступных на вашем языке (например, DBI для 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, указывающий на условие гонки в моем примере.

2 голосов
/ 22 ноября 2011

Вот несколько вариантов:

  1. Попробуй стадо. Подробнее см. Справочную страницу .
  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...