2015-12-01 6 views
-2

Я пытаюсь выяснить способ отслеживания файлов, которые я сбрасываю из своего сценария. Если в дочерних файлах нет инкремента, тогда убейте мой скрипт.

Я делаю это, чтобы освободить ресурсы, когда это не нужно. Вот что я думаю, но я думаю, что мой apporch добавит бремя для CPU. Может ли кто-нибудь предложить более эффективный способ сделать это?

Ниже сценарий должен опросить каждые 15 секунд и собрать два файла одного и того же файла, если размер двух образцов одинаковый, а затем выйдите.

checkUsage() { 
    while true; do 
    sleep 15 
    fileSize=$(stat -c%s $1) 

    sleep 10; 
    fileSizeNew=$(stat -c%s $1) 

    if [ "$fileSize" == "$fileSizeNew" ]; then 
     echo -e "[Error]: No activity noted on this window from 5 sec. Exiting..." 
     kill -9 $$ 
    fi 
    done 
} 

И я планирую назвать это следующим образом (в фоновом режиме):

checkUsage /var/log/messages & 

Я могу также получить решение, если кто-то подскажет, как контролировать команду хвост и, если ничего печать на хвосте, то на выходе , НЕ УВЕРЕН, ПОЧЕМУ ЛЮДИ ОТКЛОНЯТСЯ. Конечная цель этого вопроса - проверить, отредактирован ли какой-либо файл за последние 15 секунд. Если не выйти или выбросить ошибку.

Я достиг этого сценария выше, но я не знаю, является ли это самым умным способом достижения этого. Я задал этот вопрос, чтобы узнать мнения других, если есть альтернативный способ или лучший способ сделать это.

+3

Какая цель? Похож на проблему XY ... – Tensibai

+1

Конечная цель - гарантировать, что если/var/log/messages не увеличивают свой размер за 15 секунд, тогда убить мой скрипт. – monk

+0

Вышеупомянутый скрипт проверяет файл каждые 10 секунд, хотя, как вы положили 'sleep 10;' между 'fileSize' и' fileSizeNew' – sjsam

ответ

2

Я бы на основе проверки по времени модификации файла, а не размер, так что-то вроде этого (непроверенных код):

checkUsage() { 
    while true; do 
    # Test if file mtime is 'second arg' seconds older than date, default to 10 seconds 
    if [ $(($(date +"%s") - $(stat -c%Y /var/log/message))) -gt ${2-10} ]; then 
     echo -e "[Error]: No activity noted on this window from ${2-10} sec. Exiting..." 
     return 1 
    fi 
    #Sleep 'first arg' second, 15 seconds by default 
    sleep ${1-15} 
    done 
} 

Идея состоит в том, чтобы сравнить файл mtime с текущим временем, если он больше секунд второго аргумента, напечатать сообщение и вернуться.

И тогда я бы назвал это так поздно (или без каких-либо аргументов, чтобы использовать значения по умолчанию):

[ checkusage 20 10 ] || exit 1 

Какой бы выход из сценария с кодом 1, когда функция возврата из него бесконечный цикл (до тех пор, по мере изменения файла)

Редактирование: чтение меня снова, целевой файл также может быть параметром, чтобы обеспечить лучшее повторное использование функции, оставленной как упражнение для читателя.

0

Я полагаю, что внешняя программа изменяет /var/log/messages.

Если это так, то ниже мой сценарий (с незначительными изменениями в ваши)

#Bash script to monitor changes to file 
#!/bin/bash 
checkUsage() # Note that U is in caps 
{ 
while true 
do 
     sleep 15 
     fileSize=$(stat -c%s $1) 
     sleep 10; 
     fileSizeNew=$(stat -c%s $1) 

     if [ "$fileSize" == "$fileSizeNew" ] 
     then 
      echo -e "[Notice : ] no changes noted in $1 : gracefully exiting" 
      exit # previously this was kill -9 $$ 
      # changing this to exit would end the program gracefully. 
      # use kill -9 to kill a process which is not under your control. 
      # kill -9 sends the SIGKILL signal. 
     fi 

done 
} 
checkUsage $1 # I have added this to your script 

#End of the script 

Сохранить сценарий как checkusage и запустить его любит:

./checkusage /var/log/messages & 

Edit:

Поскольку вы ищете лучшие решения, я бы предложил inotifywait, спасибо за предложение от другого ответчика.

Ниже будет мой код:

while inotifywait -t 10 -q -e modify $1 >/dev/null 
do 
    sleep 15 # as you said the polling would happen in 15 seconds. 
done 
echo "Script exited gracefully : $1 has not been changed" 

Ниже приведены сведения из inotifywait manpage

< -t секунд> --timeout < секунд> Выход, если соответствующее событие не произошло в пределах < секунд> секунд. Если < секунд> равно нулю (по умолчанию), ждать неопределенно для события.

-e < event>, --event < event> Слушайте только определенные события (события). События, которые можно прослушать, перечислены в разделе СОБЫТИЯ. Эта опция может быть указана более одного раза. Если опущено, то прослушиваются все события .

-q, --quiet Если указано один раз, программа будет менее подробной. В частности, он не укажет, когда он завершил установку всех часов inotify.

изменение (событие) Просмотренный файл или файл в просматриваемом каталоге был написан на.

Примечания

Вы, возможно, придется установить inotify-tools первым, чтобы использовать команду inotifywait. Проверьте страницу inotify-tools в Github.

+0

Эти изменения * очень * minor ... Что вы делали, кроме изменения отступов и печатных сообщений? Почему 'kill', а не' exit'? – arco444

+0

На самом деле я имел в виду, что выход будет изящным, а kill -9 будет сильным. Pls видит редактирование. – sjsam

+0

'изящно выходящий'' kill -9' hahaha – 123

1

Если в Linux, в локальной файловой системе (Ext4, BTRFS, ...) - нет сетевой файловой системы, то вы можете рассмотреть объекты inotify(7): что-то может быть вызвано, когда какой-либо файл или каталог будут изменены или доступны.

В частности, у вас может быть какая-то работа над окном через файл incrontab(5); возможно, он мог бы общаться с какой-либо другой работой ...

PS. Я не уверен, чтобы понять, что вы действительно хотите сделать ...

+0

Конечная цель этого вопроса - проверить, отредактирован ли какой-либо файл за последние 15 секунд. Если не выйти или выбросить ошибку. Я достиг этого сценария выше, но я не знаю, является ли это самым умным способом достижения этого. Я задал этот вопрос, чтобы узнать мнения других, если есть альтернативный способ или лучший способ сделать это. – monk

+0

Почему вы пытаетесь это сделать? В чем проблема, которую вы пытаетесь решить? – Sobrique

+0

Я пытаюсь проверить, есть ли какие-либо изменения, внесенные в некоторый файл X за последние 15 секунд. Если есть какие-либо шансы, затем игнорируйте и продолжайте проверку через некоторое время. Однако, если в файле X нет изменений, то выйдите или выполните ошибку. – monk

 Смежные вопросы

  • Нет связанных вопросов^_^