【问题标题】:Process continues to hold file after file deletion文件删除后进程继续保留文件
【发布时间】:2017-05-16 01:50:50
【问题描述】:

我通过对文本文件运行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 指向新创建的文件,从而释放磁盘空间?

任何想法如何正确设置它?

【问题讨论】:

  • 您的意思是每 10 分钟启动一个新的 iostat,该 iostat 将永远运行,将输出与之前生成的所有其他 iostat 放在同一个文件中?
  • 是的,这就是当前设置
  • 那么在 61 分钟后,您总共运行了 7 个 iostat,并且该计数每 10 分钟递增一次?我很确定这不是你想要的。
  • 我明白你的意思,让我想办法解决它。

标签: linux bash scripting lsof iostat


【解决方案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 子句以向 log-daemon 发送 HUP:

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

【讨论】:

  • 好的,谢谢,这是个好主意。但是是什么导致 iostat 一直引用已删除的文件,logrotate 没有任何选项可以解决问题吗?
  • 典型的解决方案是 logrotate 向写入日志文件的守护进程发送信号,告诉它重新打开文件。但 iostat 不具备该功能,因此您需要以其他方式提供它。
  • Logrotate 不能强制另一个进程关闭打开的文件,除非通过杀死另一个进程。您可以使用 logrotate 来杀死 iostat,但这可能不是您想要的。
  • 如果它杀死 iostat,cronjob 每 10 分钟重新运行一次 iostat
【解决方案2】:

将您的 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

【讨论】:

    【解决方案3】:

    检查记录日志的文件系统是否已满。如果您遇到这种情况,请在最坏的情况下查找并终止进程或重新启动服务器。

    【讨论】:

    • 重启服务器对我来说并不紧急。我只是想把它作为一个持续存在的问题来解决。
    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多