Существует Java-процесс, который выполняет запись в какой-либо файл, например. err.log. Я переименовал его (без перезапуска Java-процесса), например. "mv err.log err.log0"и затем увидите, что процесс Java продолжает регистрацию в err.log0.
Почему это так и какая логика за этим стоит? Является ли это общим для всех платформ unix / Linux?
Процесс откроет свой файл журнала при запуске и будет держать его открытым. Он будет записывать в файл, используя файловый дескриптор, созданный при открытии файла. Имя файла не имеет отношения к дескриптору файла после его открытия, поэтому изменение имени не влияет на процесс записи в него. Это нормально и ожидаемо.
Если вы хотите, чтобы ваш процесс открывал новый файл журнала, его нужно будет записать так, чтобы он принимал сигнал, сообщающий ему закрыть старый файл и открыть новый.
Чтобы добавить к этому, вы можете открыть файл вообще без имени файла. Допустим, вы удалили этот файл, процесс продолжит запись в него, и он продолжит занимать место на диске. Когда он закроется, он будет удален. Вы также можете иметь доступ к одному и тому же файлу с несколькими именами файлов, которые вы можете создать с помощью команды «ln». Открытие и немедленное удаление записи в каталоге для файла - это распространенный способ убедиться, что пространство для временного файла освобождается при завершении процесса, даже если он аварийно завершает работу. Параметр «-i» для «ls» будет включать номер inode, чтобы вы могли определить, какие имена файлов идут в один и тот же файл.
На всякий случай, что вы пытались сделать, это повернуть файл журнала без перезапуска процесса Java, вот способ, который должен работать:
cp err.log err.log0
cat /dev/null > err.log
Это фактически копирует журнал, а затем обрезает его (устанавливает его размер равным нулю), поэтому вам нужно дополнительное дисковое пространство, но приложение должно продолжить регистрацию в err.log после этого.