文件删除后,进程继续保留文件

时间:2017-05-16 01:50:51

标签: linux bash scripting lsof iostat

我通过将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 个答案:

答案 0 :(得分:1)

一种解决方案是编写一个程序,该程序将从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

然后在logrotate配置中添加一个postrotate子句,将HUP发送到log-daemon:

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

答案 1 :(得分:0)

将你的cronjob iostat命令指向软链接不起作用吗?

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

答案 2 :(得分:0)

检查日志记录的文件系统是否已满。如果您在最坏的情况下有这样的案例查找和终止进程或重启服务器。