Гарантированное переименование файла журнала ПОСЛЕ того, как файл журнала больше не записывается в - PullRequest
0 голосов
/ 21 марта 2020

У меня настроено следующее.

На удаленной машине у меня постоянно запущен процесс, который подписывается на некоторые данные и записывает их в стандартный вывод (давайте вызовем процесс подписчиком). Я вызываю абонента из сценария. sh, который перенаправляет стандартный вывод в файл, содержащий дату в имени, и назовем этот файл журнала. В целом, я хочу добиться того, чтобы разбить эти файлы журналов на разные даты, чтобы я мог перенести их с удаленного компьютера на мой локальный компьютер.

Есть одна особенность, которая характерна для моей ситуации, которая делает решение, которое я ' Я знаком с не работать: файл журнала содержит снимок данных плюс поток дельт. Смысл этого в том, что я не могу просто войти в лог-файл, потому что в начале следующего лог-файла будет отсутствовать снимок. Теперь я имею в виду, как вручную остановить подписчика и перезапустить его из сценария. sh. Сценарий. sh перенаправит стандартный вывод в следующий устаревший файл журнала. Пропуск нескольких секунд между перезапусками не является проблемой c для моих целей. В чем проблема c будет иметь файл журнала, в котором отсутствует его первоначальный снимок.

Итак, мой вопрос: как правильно автоматизировать этот ручной процесс?

У меня есть частичный Решение, которое мне не нравится.

  • имеет новый скрипт. sh, вызываемый из crontab каждый день в определенное время
  • , затем этот скрипт убивает все процессы по имени (т.е. подписчик)
  • перезапускает подписчика с помощью stdout, указывающего на новый файл журнала, но вместо того, чтобы называть его .log, назовите его .log.part, вдохновленный этим ответом
  • тогда я должен был бы выяснить, как гарантировать, что, когда абонент умирает, файл журнала .log.part переименовывается в .log, сигнализируя, что этот файл журнала доступен для перемещения
  • , затем запускается rsyn c с локальной машины для переноса всех файлов .log.

Даже если я узнаю, как сделать последний шаг, мне не понравится решение, потому что я никогда не видел надежного трубопровод, как это построен на вершине cronjobs.

Итак, если кто-то знает надежный способ сделать это, что это? И если нет, как я могу гарантировать, что файл .log.part будет переименован в .log, когда абонент умирает?

Спасибо

...