процесс gunicorn, содержащий ссылку на logrotated файлы, в результате чего на диске заканчивается - PullRequest
0 голосов
/ 10 апреля 2019

Я использую logrotate для поворота журналов доступа / ошибок Gunicorn.

{
  su root root
  missingok
  compress
  dateext
  dateformat .%Y%m%d
  notifempty
  sharedscripts
  postrotate
      # Send USR1 signal to the gunicorn master, which will cause it to reopen log files.
      # http://docs.gunicorn.org/en/latest/deploy.html#logging
      /bin/kill -USR1 $(cat /var/run/xxxx/api.pid 2>/dev/null) 2> /dev/null || true
  endscript
}

Журналы вращаются правильно и сжимаются, и создается новый файл журнала.однако gunicorn не освобождает указатель на удаленный файл журнала и продолжает запись в этот файл журнала.из-за этого файловое пространство на диске не освобождается и строки журнала теряются.

я могу видеть записи с помощью lsof

gunicorn  22284           root    9w   REG  252,1 43263609     0 117968 /usr/cachelogic/log/gunicorn_unapi_access.log-20190410 (deleted)

, если я перезапущу службу gunicorn, файловое пространство будетосвобождается, и процесс также записывает логи в новый файл.но старые журналы, которые были записаны в удаленный файл, будут потеряны.

Я хотел бы решить проблему с logrotate без перезапуска службы.Как убедиться, что журналы записываются в новый файл журнала, а не в файл журнала, и освобождается ли место на диске.

1 Ответ

0 голосов
/ 10 апреля 2019

Вы ищете вариант copytruncate.Вот как работает файловая система.Когда процесс открыл дескриптор для файла, и вы удалите этот файл (например, из командной строки), дескриптор все еще будет доступен в памяти (через inode).Так что copytruncate просто скопирует ваш файл журнала, а открытый в данный момент файл журнала (связанный с gunicor) будет обрезан до 0.

...