Делаю такой тест:
Запускаю скрипт, который открывает файл в режиме чтения и дописывает в него по строке раз в 0.1 секунду.
Запускаю logrotate с опцией copytruncate в конфиге, который должен обрезать файл по достижении им maxsize 10K (и сжимать потом ротированное)
Что имею в итоге: сжатая копия файла лога создаётся, всё ОК.
Исходный файл при этом не обнуляется. При этом в режиме logrotate -v пишет, что он собирается обнулить файл, чего в действительности не происходит.
Судя по описанию copytruncate, он нужен как раз для моего целевого случая - а это сотни скриптов, написанных без малейшего представления о сигналах и каких-то там ротациях логов, пишущих в файлы до тех пор, пока файловая система не лопнет.
В общем, как же так и почему copytruncate столь странно себя ведёт? logrotate стоит версии 3.16 (проверял и на дистрибутивном 3.8).
P.S. Ведержка из man logrotate.conf, чтобы вам самим не искать:
copytruncate
Truncate the original log file to zero size in place after creating a copy, instead of moving the old log file and optionally creating a new one.
It can be used when some program cannot be told to close its logfile and thus might continue writing (appending) to the previous log file forever.
Note that there is a very small time slice between copying the file and truncating it, so some logging data might be lost.