Процесс продолжает удерживать файл после удаления файла

Я создал файл журнала, запустив iostat введите текстовый файл и выполните команду в фоновом режиме, используя nohup,

#nohup iostat -xm 5 > /z/logfile.txt &

Позже я создал cronjob, который запускается каждые десять минут, выполняя то же самое, что и выше, после того, как я понял, что мой процесс был остановлен перезагрузкой. Я также настроил ротацию журналов, как показано ниже:

/z/logfile.txt {
        size 20M
        rotate 0
        create 0644 root root
        missingok
        notifempty

} 

Теперь я понял, что logfile.txt удаляется, но iostat Команда продолжает указывать на удаленные файлы, как показано lsof -n | grep deleted команда. Там дисковое пространство не освобождается.

Как я могу убедиться, что файлы повернуты и после iostat указывает на вновь созданный файл, освобождая место на диске?

Есть идеи как правильно его настроить?

3 ответа

Одним из решений было бы написать программу, которая будет читать из iostat, записывать в выходной файл и принимать сигнал для повторного открытия файла. Например, если вы сделали: iostat -xm 5 | log-daemon /z/logfile.txt где log-daemon - это простой скрипт вроде:

#!/bin/bash
echo $$ > /var/run/log-daemon
exec > $1
trap 'exec > $1' SIGHUP
read line
while test $? -le 0; do 
        echo $line
        read line
done

Затем добавьте предложение postrotate в конфигурацию logrotate, чтобы отправить HUP лог-демону:

postrotate
               /usr/bin/kill -HUP $(cat /var/run/log-daemon)

Проверьте, заполнена ли файловая система, в которой ведется запись. Если у вас есть такой случай, найдите и убейте процесс или перезагрузите сервер в худшем случае.

Не сработает ли указание вашей команды cronjob iostat на softlink?

ln -s /z/logfile.txt iostat_link.txt
nohup iostat -xm 5 > /z/iostat_link.txt &

Я не использовал logrotate раньше, но я проверил это, вручную изменив файл в фоновом режиме, пока я выполнял это:

#Make the files
touch afile1.txt
ln -s afile1.txt file.txt

#Kick off loop
for i in {1..1000};do echo "running still $i" >> file.txt;sleep 3;done &

[localhost (2017-05-15 20:30:55) IP: 26.176 ~]# cat afile1.txt
running still 7
running still 8
running still 9

#Change the file out from under the loop
mv afile1.txt afile1.txt.backup;touch afile1.txt

[localhost (2017-05-15 20:31:21) IP: 26.176 ~]# cat afile1.txt
running still 15
running still 16
running still 17
Другие вопросы по тегам