Процесс продолжает удерживать файл после удаления файла
Я создал файл журнала, запустив 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