Здравствуйте, есть такая задача. Надо запускать некоторую команду только при условии, что содержимое опрелённой папки изменилось. Как мне посоветуете сделать это скриптом #!/bin/sh ?Для конкретизации пусть команда будет `sleep 10`, а папка `/tmp`.
>Здравствуйте, есть такая задача. Надо запускать некоторую команду только при условии, что
>содержимое опрелённой папки изменилось. Как мне посоветуете сделать это скриптом #!/bin/sh
>?
>
>Для конкретизации пусть команда будет `sleep 10`, а папка `/tmp`.Посмотрите, может это вам поможет
http://mednet.ingv.it/homepage/delprete/dirmon/dirmon.html
>Посмотрите, может это вам поможет
>http://mednet.ingv.it/homepage/delprete/dirmon/dirmon.htmlСпасибо, но это черезчур.
Мне бы хотелось сделать это одним скриптом.Что-то типа:
dir="/tmp"
run="sleep 10"
беск_цикл {
если dir не изменился, то останов.
иначе run
}
А запуск скрипта как демона я обеспечу.
Только вот на shell почти не умею скрипты писать, поэтому нужна помощь
>>http://mednet.ingv.it/homepage/delprete/dirmon/dirmon.html
>
>Спасибо, но это черезчур.зато тот демон позволяет реагировать на изменение практически сразу.
если же это не является жизнено необходимым то можно сделать что-то вроде вот этого примера.
----------------------
#!/bin/bashls -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
doneecho "Алё, /path/to/dir изменилось."
----------------------
>зато тот демон позволяет реагировать на изменение практически сразу.
>если же это не является жизнено необходимым то можно сделать что-то вроде
>вот этого примера.
>----------------------
>#!/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 хранить)
>
>У меня вопрос: а просто ls /path/to/dir в этом случае подойдёт? (чтобы
>меньше в dir.check хранить)подойдет если надо ловить только добавление новых файлов, если же требуется ловить и изменения существующих то нужно ls -t, те опции я написал автоматически.
кстати sleep понимает не только целые числа, по крайней мере та имплементация что есть у меня под рукой, то есть можно задать sleep 0.1 и оно будет проверять через одну десятую секунды.
да и если директория содержит много файлов то могут быть проблемы.
все таки демон использующий возможности ОС мне кажется предпочтительней.
>>
>>У меня вопрос: а просто ls /path/to/dir в этом случае подойдёт? (чтобы
>>меньше в dir.check хранить)
>
>подойдет если надо ловить только добавление новых файлов, если же требуется ловить
>и изменения существующих то нужно ls -t, те опции я написал
>автоматически.исправление 1: ls -lt
так как с -l больше шансов заметить изменения в директории
$ man lsисправление 2: маленькое время sleep не гарантирует что изменения будут отловлены за это время, так как -l показывает время с точностью до минуты.
>да и если директория содержит много файлов то могут быть проблемы.Не понимаю, какие могут возникнуть проблемы, если в директории много файлов?
>все таки демон использующий возможности ОС мне кажется предпочтительней.
Этот скрипт и будет запущен, как демон :)
Привет!
Я тут немного не в тему.
Но очень хочется знать> Этот скрипт и будет запущен, как демон :)
как это делается?
Как запустить скрипт как демон?
>Привет!
>Я тут немного не в тему.
>Но очень хочется знать
>
>> Этот скрипт и будет запущен, как демон :)
>
>как это делается?
>Как запустить скрипт как демон?
http://cr.yp.to/daemontools.htmlЯ пользуюсь этим.
>Привет!
>Я тут немного не в тему.
>Но очень хочется знать
>
>> Этот скрипт и будет запущен, как демон :)
>
>как это делается?
>Как запустить скрипт как демон?man nohup
+++ man на используемый shell
e.g., man sh /background
>----------------------
>#!/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.1while [ 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* не меняются.
Я, наверное, не туда вписал команду...
честно говоря не я понял как должны обновлятся файлы /usr/local/libexec/hm*.
тот пример должен был завершатся по изменению дмректории и все команды после done должны выполнится.
вот версия которая висит постоянно и выполняет нечто по изменению директории. И еще почитал я man ls повнимательнее и нашел изумительный ключик --full-time. Теперь скрипт будет срабатывать по каждому чиху.
------------------
ls -t --full-time $DIR &> /tmp/dir.check.1trap 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 каждые сколько-ко там секунд.
>честно говоря не я понял как должны обновлятся файлы /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 каждые сколько-ко там секунд.
да мне раз в минуту более чем достаточно :)
Ясно, понял свою ошибку. Сейчас всё ок. Спасибо.
Есть очень полезная команда md5sum, которая рожает контрольную сумму md5 и может ее проверить, ежели запустить ее с ключиком --check. Обмануть ее ОЧЕНЬ сложно. Можно вычислять контрольные суммы листингов и сравнивать их. Правда нагрузка на проц будет больше, чем при использовании diff
>Есть очень полезная команда md5sum, которая рожает контрольную сумму md5 и может
>ее проверить, ежели запустить ее с ключиком --check. Обмануть ее ОЧЕНЬ
>сложно. Можно вычислять контрольные суммы листингов и сравнивать их. Правда нагрузка
>на проц будет больше, чем при использовании diff
можно еще приколотся и сделать прикол с make ;-)
что-то вроде
---Makefile
flag_file : /tmp/*
my_script
touch flag_file
--- через крон или какой либо другой скрипт тыркать make ;-)