akalend
@akalend
программирую

Один процесс пишет в файл, другой его переименовывает?

хочется реализовать что-то типа ротации логов,


реалии таковы, что демон-скрипт постоянно пишет в лог-файл, это сделано и работает

в полночь, хочу переименовать файл, что будет:

демон — не знает что файл переименован, файл переоткроется?

не будет ли потери лог информации


интересует какие могут быть грабли


в добавление к вышесказанному:

демон запускается через exec из скрипта через  nohup с перенаправлением stdout в лог-файл

перезакрывать файл не получится
  • Вопрос задан
  • 3203 просмотра
Пригласить эксперта
Ответы на вопрос 7
@relgames
Java Developer
Дескриптор файла остается неизменным, т.е. если скрипт получил inode файла, он может в него писать, пока не закроет, не взирая на переименование и даже удаление.

Как вариант, можно открывать/закрывать файл каждый раз, когда пишется лог. Ну или писать логику закрытия/переименования/открытия в самом демоне.
Ответ написан
Комментировать
3vi1_0n3
@3vi1_0n3
Если это, например, bash-скрипт, в котором используется вывод типа ">> /var/log/mydaemon.log" то проблем не будет.
Если это была бы программа на C, допустим, открывающая файл на запись, то переименование скорее всего не сработало бы до переоткрытия.
Ответ написан
printf
@printf
Ем детей.
Нужно переоткрыть файл, иначе после переименования будет продолжать писаться старый файл.
Если особенная точность не нужна, можно просто, скажем, раз в час переоткрывать файл на запись.
Ответ написан
svk
@svk
Я так понимаю, переименовывание файла нужно для log-rotate? Тогда самое правильное будет делать так:
cp logfile logfile.old
cp /dev/null logfile
Ответ написан
taliban
@taliban
php программист
Лочить файл нужно при записи, а тот демон что бекап делает должен ждать пока файл разлочится и делать что нужно.
Ответ написан
Комментировать
seriyPS
@seriyPS
вообще «в классике» схема такая:
1. демон открывает файл и пишет в него лог
2. логротейт делает логфайлу mv и отсылает демону сигнал, например SIGHUP
3. У демона есть для этого обработчик который ЛИБО переоткрывает файл ЛИБО делает seek(0)
Т.к. в вашем случае нет возможности контролировать файловый дескриптор, решение напрашивается само собой — написать или найти готовый «прокси» в который будет перенаправляться вывод и который сможет ловить сигналы и переоткрывать файл.
exec("my_daemon | my_proxy --out=/my/log/file")
Можно не сигнал а, например, touch какого то файла. Но сигнал эффективнее и проще.

Вот еще пример hg.python.org/cpython/file/2145593d108d/Lib/logging/handlers.py#l358 тут сравниваются inode файла каждый раз перед записью.

PS: а разве nohup что-то пишет в stderr/out???
Ответ написан
Koroed
@Koroed
ну напишите свой ротатор логов, который принимает поток в качестве входного параметра и направьте вывод в ротатор, вместо файлов
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы