Добрый.
В кроне ежечасно архивируются файлы в определенной дире, архивируются все.
Но в эту папку постоянно пишется новый файл, заканчивается, начинает писаться другой.
Нужно чтобы при архивации этот текущий рабочий файл не учитывался. Как такое организовать?
Вот строка из крона:
#
#
0 * * * * find /dir/ -name '*.svl' | xargs gzip
>Добрый.
>В кроне ежечасно архивируются файлы в определенной дире, архивируются все.
>Но в эту папку постоянно пишется новый файл, заканчивается, начинает писаться другой.
>
>Нужно чтобы при архивации этот текущий рабочий файл не учитывался. Как такое
>организовать?
>Вот строка из крона:
>#
>#
>0 *
> * *
> *
> find /dir/ -name '*.svl' | xargs gzip
может быть грубовато, но как-то так
find /dir/ -name '*.svl' > aa | expr 0 \- `cat aa | wc -l` \+ 1 > a1 | head `cat a1` `cat aa` | xargs gzip
>может быть грубовато, но как-то так
>find /dir/ -name '*.svl' > aa | expr 0 \- `cat aa | wc -l` \+ 1 > a1 | head `cat a1` `cat aa` | xargs gzip
Сильно :)А может быть как то можно узнать, что файл занят другим процессом и по этому признаку его не трогать??
>А может быть как то можно узнать, что файл занят другим процессом
>и по этому признаку его не трогать??В этом вам поможет lsof.
>В этом вам поможет lsof.
man lsof
No manual entry for lsof
:(
>>В этом вам поможет lsof.
>man lsof
>No manual entry for lsof
>:(А сам-то lsof у вас есть? Попробуйте "lsof --help". Ну, а если нужен мануал, то вот:
http://www.opennet.me/man.shtml?topic=lsofВообще же вам достаточно и такой конструкции:
lsof | grep <your_file>Если в списке открытых файлов, выдаваемом lsof, найдется указанный вами файл, значит, он
как раз занят каким-то процессом. :-)
>А сам-то lsof у вас есть? Попробуйте "lsof --help". Ну, а если
>нужен мануал, то вот:
>http://www.opennet.me/man.shtml?topic=lsof
>
>Вообще же вам достаточно и такой конструкции:
>lsof | grep <your_file>Если в списке открытых файлов, выдаваемом lsof, найдется указанный вами файл, значит, он
>как раз занят каким-то процессом. :-)
Небыло :)
Сейчас поставил, работает.
Осталось только привязать его оутпут к инпуту gzip'а :)
>Небыло :)
>Сейчас поставил, работает.
>Осталось только привязать его оутпут к инпуту gzip'а :)Так за чем же дело стало? ;-)
find /dir -name "*.svl" | grep -v `lsof | grep "/dir" | awk '{print $9}' | uniq` | xargs gzipЯ хотел, правда, оставить это вам в качестве
домашнего задания, но что-то не в меру добрый я сегодня. :-)P. S. Возможно, вам придется изменить номер поля, выводимого awk (возможно, но не
обязательно). Тут уж смотрите сами.
>Так за чем же дело стало? ;-)find /dir -name "*.svl" | grep
>-v `lsof | grep "/dir" | awk '{print $9}' | uniq`
>| xargs gzip Я хотел, правда, оставить это вам в качестве
>
>домашнего задания, но что-то не в меру добрый я сегодня. :-)
>
>P. S. Возможно, вам придется изменить номер поля, выводимого awk (возможно, но
>не
>обязательно). Тут уж смотрите сами.
Готовые решения, это конечно хорошо, но я так и не смог "въехать" в эту семантику :))
Скрипт не запустился, ругается на параметры грепа.
Если не сложно, можно по шагам объяснить процедуру действа? :)
>Скрипт не запустился, ругается на параметры грепа.
>Если не сложно, можно по шагам объяснить процедуру действа? :)Та-ак, в том, что скрипт не запустился, моя вина: не совсем точно команду составил.
По зрелом размышлении, она должна бы выглядеть так:find /dir -name "*.svl" | grep -v `lsof | grep "/dir" | sed 's/ */ /g' | awk '{print $NF}' | uniq` | xargs gzipА сейчас приступим к разбору. И начнем его с последовательности команд, заключенных в
обратные кавычки:lsof | grep " /dir" | sed 's/ */ /g' | awk '{print $NF}' | uniqПроисходит тут следующее:1. Команда lsof формирует список открытых файлов.
2. Команда grep "/dir" отбирает из этого списка строки, содержащие "/dir".
3. Команда sed 's/ */ /g' заменяет в отобранных строках последовательности из двух
и более пробелов на один.
4. Команда awk '{print $NF}' выводит на печать только последнее поле в полученых
строках (в нем как раз и содержится имя файла).
5. Команда uniq удаляет повторяющиеся строки (это на случай, если файл открыт более чем
одним процессом).Итак, мы получили имя открытого файла. Оно передается в качестве аргумента команде
grep -v для того, чтобы исключить этот файл из вывода команды find /dir -name "*.svl".
И, наконец, имена остальных файлов через xargs передаются на вход команды gzip.Уф-ф, вроде бы все. Какое, однако, монументальное объяснение получилось. :-)
P. S. Да, чуть не забыл: не могли бы вы сообщить, какой ОС пользуетесь и какие именно
сообщения об ошибках вам были выданы (просто скопируйте их и покажите здесь)?
>Та-ак, в том, что скрипт не запустился, моя вина: не совсем точно
>команду составил.
>По зрелом размышлении, она должна бы выглядеть так:find /dir -name "*.svl"
>| grep -v `lsof | grep "/dir" | sed 's/
>*/ /g' | awk '{print $NF}' | uniq` | xargs gzip
>А сейчас приступим к разбору. И начнем его с последовательности команд,
>заключенных в
>обратные кавычки:lsof | grep " /dir" | sed 's/ */ /g'
>| awk '{print $NF}' | uniq Происходит тут следующее:
>
>1. Команда lsof формирует список открытых файлов.
>2. Команда grep "/dir" отбирает из этого списка строки, содержащие "/dir".
>3. Команда sed 's/ */ /g' заменяет в отобранных строках последовательности
>из двух
>и более пробелов на один.
>4. Команда awk '{print $NF}' выводит на печать только последнее поле в
>полученых
>строках (в нем как раз и содержится имя файла).
>5. Команда uniq удаляет повторяющиеся строки (это на случай, если файл открыт
>более чем
>одним процессом).
>
>Итак, мы получили имя открытого файла. Оно передается в качестве аргумента команде
>
>grep -v для того, чтобы исключить этот файл из вывода команды find
>/dir -name "*.svl".
>И, наконец, имена остальных файлов через xargs передаются на вход команды gzip.
>
>
>Уф-ф, вроде бы все. Какое, однако, монументальное объяснение получилось. :-)
>
>P. S. Да, чуть не забыл: не могли бы вы сообщить, какой
>ОС пользуетесь и какие именно
>сообщения об ошибках вам были выданы (просто скопируйте их и покажите здесь)?ОС - FreeBSD 6.1
Сообщения:
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
Прямо так и выводится, /dir я естественно меняю на свою директорию.Выражаю искреннюю благодарность за подробное разжевывание материала :)
Сегодня вечером буду пробовать.
Удачи в Новом Году! :)
>ОС - FreeBSD 6.1
>Сообщения:
>Usage: grep [OPTION]... PATTERN [FILE]...
>Try `grep --help' for more information.
>Прямо так и выводится, /dir я естественно меняю на свою директорию.Хм, я именно на FreeBSD 6.1 и обкатывал эту команду.
Погонял ее еще малость и остановился на такой конструкции:find /dir -name "*.svl" | grep -v "`lsof | grep "/dir" | sed 's/ */ /g' | awk '{print $NF}' | sort -u`" | xargs gzipПроверил несколько раз - работает. Изменения: заключил в кавычки выражение-аргумент для
команды grep -v и заменил uniq на sort -u.>Выражаю искреннюю благодарность за подробное разжевывание материала :)
Да всегда пожалуйста. :-)>Удачи в Новом Году! :)
И вам того же.
>Хм, я именно на FreeBSD 6.1 и обкатывал эту команду.
>Погонял ее еще малость и остановился на такой конструкции:find /dir -name
>"*.svl" | grep -v "`lsof | grep "/dir" | sed 's/
> */ /g' | awk '{print $NF}' | sort -u`" |
>xargs gzip Проверил несколько раз - работает. Изменения: заключил в кавычки
>выражение-аргумент для
>команды grep -v и заменил uniq на sort -u.При попытке выполнить, пишет:
NF: Undefined variable.
:(
Пробовал и с открытым файлом в дире и со всеми закрытыми.
>При попытке выполнить, пишет:
>NF: Undefined variable.
>:(
>Пробовал и с открытым файлом в дире и со всеми закрытыми.
Это уже awk ругается. Нич-чего не понимаю...
Покажите, пожалуйста, ваш скрипт полностью. Будем посмотреть, где там собака порылась.
>Покажите, пожалуйста, ваш скрипт полностью. Будем посмотреть, где там собака порылась.
Скрипт беру ваш, копипастом отсюда, единственное что меняю, так это /dir на свою директорию, все.
А говорят, в рунете нет альтруистов :)
Добавила в свою "шкатулку знаний" скрипт allez'a.Сорри за оффтопик и с Новым Годом!
>А говорят, в рунете нет альтруистов :)
Кто говорит? Враки :))Кстати, пока суть да дело, сделал так:
Добавил к find /dir/ -name '*.' параметр -mmin +3. Т.е. берем только файлы у которых время последней модификации было более трех минут назад. Так как "открытый" файл пишется постоянно, то в принципе должно работать.
Проверить смогу чуть позже.
Полностью скрипт теперь выглядит так:
find /dir -name "*.svl" -mmin +3 | xargs gzip
>Добрый.>Нужно чтобы при архивации этот текущий рабочий файл не учитывался. Как такое
>организовать?newsyslog не устраивает ?
>>Нужно чтобы при архивации этот текущий рабочий файл не учитывался. Как такое
>>организовать?
>
> newsyslog не устраивает ?
Кстати, Kleo, весьма разумное решение. Что-то я, увлекшись вашей задачей, за деревьями
леса не увидел. :-) Действительно, почему бы не заставить newsyslog трудиться над вашей
проблемой? Он как раз для того и предназначен. И тот огород, что мы с вами нагородили,
не понадобится (а заодно и те велосипеды, которые тут наизобретались ;-)).
>Кстати, Kleo, весьма разумное решение. Что-то я, увлекшись вашей задачей, за деревьями
>
>леса не увидел. :-) Действительно, почему бы не заставить newsyslog трудиться над
>вашей
>проблемой? Он как раз для того и предназначен. И тот огород, что
>мы с вами нагородили,
>не понадобится (а заодно и те велосипеды, которые тут наизобретались ;-)).Насколько я понял из man newsyslog, эта тулза может следить/архивировать только какой то конкретный, именованный файл (auth.log, messages, etc...), исходя из его макс. размера или даты последней модификации.
В моем же случае, о файлах известно лишь их расширение, да и размер весьма варьируется. Плюс ко всему имя должно оставаться не изменным, единственно меняется расширение на gz (архив тоесть).
По моему это немного не то. Хотя возможно неправильно истолковал документацию :)
>Насколько я понял из man newsyslog, эта тулза может следить/архивировать только какой
>то конкретный, именованный файл (auth.log, messages, etc...), исходя из его макс.
>размера или даты последней модификации.
>В моем же случае, о файлах известно лишь их расширение, да и
>размер весьма варьируется. Плюс ко всему имя должно оставаться не изменным,
>единственно меняется расширение на gz (архив тоесть).
>По моему это немного не то. Хотя возможно неправильно истолковал документацию :)
>Тоды ой :-). Я-то документацию на него уже давным-давно не читал: однажды настроил и
теперь по большей части пользуюсь отлаженными конфигами либо целыми клонированными
системами.Ну что же, значит, придется продолжать развитие собственного решения.