URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3899
[ Назад ]

Исходное сообщение
"Проверять папку на обновления"

Отправлено alexeylomov , 02-Фев-05 18:18 
Здравствуйте, есть такая задача. Надо запускать некоторую команду только при условии, что содержимое опрелённой папки изменилось. Как мне посоветуете сделать это скриптом #!/bin/sh ?

Для конкретизации пусть команда будет `sleep 10`, а папка `/tmp`.


Содержание

Сообщения в этом обсуждении
"Проверять папку на обновления"
Отправлено Pablo , 02-Фев-05 18:30 
>Здравствуйте, есть такая задача. Надо запускать некоторую команду только при условии, что
>содержимое опрелённой папки изменилось. Как мне посоветуете сделать это скриптом #!/bin/sh
>?
>
>Для конкретизации пусть команда будет `sleep 10`, а папка `/tmp`.

Посмотрите, может это вам поможет
http://mednet.ingv.it/homepage/delprete/dirmon/dirmon.html


"Проверять папку на обновления"
Отправлено alexeylomov , 02-Фев-05 18:41 
>Посмотрите, может это вам поможет
>http://mednet.ingv.it/homepage/delprete/dirmon/dirmon.html

Спасибо, но это черезчур.
Мне бы хотелось сделать это одним скриптом.

Что-то типа:
dir="/tmp"
run="sleep 10"
беск_цикл {
  если dir не изменился, то останов.
  иначе run
}
А запуск скрипта как демона я обеспечу.
Только вот на shell почти не умею скрипты писать, поэтому нужна помощь


"Проверять папку на обновления"
Отправлено Xenu , 02-Фев-05 19:44 
>>http://mednet.ingv.it/homepage/delprete/dirmon/dirmon.html
>
>Спасибо, но это черезчур.

зато тот демон позволяет реагировать на изменение практически сразу.
если же это не является жизнено необходимым то можно сделать что-то вроде вот этого примера.
----------------------
#!/bin/bash

ls -lsrt /path/to/dir &> /tmp/dir.check.1
while [ 1 ]
do
  ls -lsrt /path/to/dir &> /tmp/dir.check.2
  diff /tmp/dir.check.1 /tmp/dir.check.2 &> /dev/null
  [ $? -ne 0 ] && break
  mv /tmp/dir.check.2 /tmp/dir.check.1
  sleep 10
done

echo "Алё, /path/to/dir изменилось."
----------------------


"Проверять папку на обновления"
Отправлено alexeylomov , 02-Фев-05 20:06 
>зато тот демон позволяет реагировать на изменение практически сразу.
>если же это не является жизнено необходимым то можно сделать что-то вроде
>вот этого примера.
>----------------------
>#!/bin/bash
>
>ls -lsrt /path/to/dir &> /tmp/dir.check.1
>while [ 1 ]
>do
>  ls -lsrt /path/to/dir &> /tmp/dir.check.2
>  diff /tmp/dir.check.1 /tmp/dir.check.2 &> /dev/null
>  [ $? -ne 0 ] && break
>  mv /tmp/dir.check.2 /tmp/dir.check.1
>  sleep 10
>done
>
>echo "Алё, /path/to/dir изменилось."
>----------------------


У меня вопрос: а просто ls /path/to/dir в этом случае подойдёт? (чтобы меньше в dir.check хранить)


"Проверять папку на обновления"
Отправлено Xenu , 02-Фев-05 21:34 
>
>У меня вопрос: а просто ls /path/to/dir в этом случае подойдёт? (чтобы
>меньше в dir.check хранить)

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

кстати sleep понимает не только целые числа, по крайней мере та имплементация что есть у меня под рукой, то есть можно задать sleep 0.1 и оно будет проверять через одну десятую секунды.

да и если директория содержит много файлов то могут быть проблемы.

все таки демон использующий возможности ОС мне кажется предпочтительней.


"Проверять папку на обновления"
Отправлено Xenu , 02-Фев-05 21:55 
>>
>>У меня вопрос: а просто ls /path/to/dir в этом случае подойдёт? (чтобы
>>меньше в dir.check хранить)
>
>подойдет если надо ловить только добавление новых файлов, если же требуется ловить
>и изменения существующих то нужно ls -t, те опции я написал
>автоматически.

исправление 1: ls -lt
так как с -l больше шансов заметить изменения в директории
$ man ls

исправление 2: маленькое время sleep не гарантирует что изменения будут отловлены за это время, так как -l показывает время с точностью до минуты.


"Проверять папку на обновления"
Отправлено alexeylomov , 03-Фев-05 12:50 
>да и если директория содержит много файлов то могут быть проблемы.

Не понимаю, какие могут возникнуть проблемы, если в директории много файлов?

>все таки демон использующий возможности ОС мне кажется предпочтительней.

Этот скрипт и будет запущен, как демон :)


"Проверять папку на обновления"
Отправлено regunkov , 03-Фев-05 14:36 
Привет!
Я тут немного не в тему.
Но очень хочется знать

> Этот скрипт и будет запущен, как демон :)

как это делается?
Как запустить скрипт как демон?


"Проверять папку на обновления"
Отправлено alexeylomov , 03-Фев-05 14:54 
>Привет!
>Я тут немного не в тему.
>Но очень хочется знать
>
>> Этот скрипт и будет запущен, как демон :)
>
>как это делается?
>Как запустить скрипт как демон?


http://cr.yp.to/daemontools.html

Я пользуюсь этим.


"Проверять папку на обновления"
Отправлено chip , 03-Фев-05 16:19 
>Привет!
>Я тут немного не в тему.
>Но очень хочется знать
>
>> Этот скрипт и будет запущен, как демон :)
>
>как это делается?
>Как запустить скрипт как демон?

man nohup
+++ man на используемый shell
e.g., man sh /background



"Проверять папку на обновления"
Отправлено alexeylomov , 03-Фев-05 14:07 
>----------------------
>#!/bin/bash
>
>ls -lsrt /path/to/dir &> /tmp/dir.check.1
>while [ 1 ]
>do
>  ls -lsrt /path/to/dir &> /tmp/dir.check.2
>  diff /tmp/dir.check.1 /tmp/dir.check.2 &> /dev/null
>  [ $? -ne 0 ] && break
>  mv /tmp/dir.check.2 /tmp/dir.check.1
>  sleep 10
>done
>
>----------------------

Мне только не совсем понятно: какая команда тут выполняется при изменении директории?

Вот мой скрипт, написанный по этому примеру:
----------------------
#! /bin/sh
ls -lrt /usr/local/libexec/hm* &> /tmp/hmcheck.1

while [ 1 ]
do
  ls -lrt /usr/local/libexec/hm* &> /tmp/hmcheck.2
  diff /tmp/hmcheck.1 /tmp/hmcheck.2 &> /dev/null
[ $? -ne 0 ] && break
  mv /tmp/hmcheck.2 /tmp/hmcheck.1
  /usr/local/bin/cron_fill
  sleep 30
done
----------------------

Объясню: скрипт /usr/local/bin/cron_fill создаёт файл в /etc/cron.d/

Так вот, крон.д обновляется каждые 30 сек, хотя файлы с маской /usr/local/libexec/hm* не меняются.

Я, наверное, не туда вписал команду...


"Проверять папку на обновления"
Отправлено Xenu , 03-Фев-05 18:28 
честно говоря не я понял как должны обновлятся файлы /usr/local/libexec/hm*.
тот пример должен был завершатся по изменению дмректории и все команды после done должны выполнится.
вот версия которая висит постоянно и выполняет нечто по изменению директории. И еще почитал я man ls повнимательнее и нашел изумительный ключик --full-time. Теперь скрипт будет срабатывать по каждому чиху.
------------------
ls -t --full-time $DIR &> /tmp/dir.check.1

trap exit_signal INT QUIT TERM

while [ 1 ]
do
    ls -t --full-time $DIR &> /tmp/dir.check.2
    diff /tmp/dir.check.1 /tmp/dir.check.2 &> /dev/null
    if [ $? -ne 0 ]
    then
        echo "Здесь должна быть команда которую надо выполнить."
    fi
    mv /tmp/dir.check.2 /tmp/dir.check.1
    sleep 10
done
------------------
Если в директории много файлов, то ls будет долго работать. Относительно долго. И дергать hard каждые сколько-ко там секунд.


"Проверять папку на обновления"
Отправлено alexeylomov , 03-Фев-05 18:50 
>честно говоря не я понял как должны обновлятся файлы /usr/local/libexec/hm*.
>тот пример должен был завершатся по изменению дмректории и все команды после
>done должны выполнится.
>вот версия которая висит постоянно и выполняет нечто по изменению директории. И
>еще почитал я man ls повнимательнее и нашел изумительный ключик --full-time.
>Теперь скрипт будет срабатывать по каждому чиху.
>------------------
>ls -t --full-time $DIR &> /tmp/dir.check.1
>
>trap exit_signal INT QUIT TERM
>
>while [ 1 ]
>do
>    ls -t --full-time $DIR &> /tmp/dir.check.2
>    diff /tmp/dir.check.1 /tmp/dir.check.2 &> /dev/null
>    if [ $? -ne 0 ]
>    then
>        echo "Здесь должна быть
>команда которую надо выполнить."
>    fi
>    mv /tmp/dir.check.2 /tmp/dir.check.1
>    sleep 10
>done
>------------------
>Если в директории много файлов, то ls будет долго работать. Относительно долго.
>И дергать hard каждые сколько-ко там секунд.


да мне раз в минуту более чем достаточно :)
Ясно, понял свою ошибку. Сейчас всё ок. Спасибо.


"Проверять папку на обновления"
Отправлено dimus , 07-Фев-05 10:09 
Есть очень полезная команда md5sum, которая рожает контрольную сумму md5 и может ее проверить, ежели запустить ее с ключиком --check. Обмануть ее ОЧЕНЬ сложно. Можно вычислять контрольные суммы листингов и сравнивать их. Правда нагрузка на проц будет больше, чем при использовании diff

"Проверять папку на обновления"
Отправлено MaximKuznetsov , 07-Фев-05 22:06 
>Есть очень полезная команда md5sum, которая рожает контрольную сумму md5 и может
>ее проверить, ежели запустить ее с ключиком --check. Обмануть ее ОЧЕНЬ
>сложно. Можно вычислять контрольные суммы листингов и сравнивать их. Правда нагрузка
>на проц будет больше, чем при использовании diff
можно еще приколотся и сделать прикол с make ;-)
что-то вроде
---Makefile
flag_file : /tmp/*
   my_script
   touch flag_file
--- через крон или какой либо другой скрипт тыркать make ;-)