我有一些在 tomcat 应用程序中创建的日志文件,我通过 gzip 命令执行收缩的 shell 脚本备份文件,收缩后,虽然旧的日志文件已经不存在,但它们仍然占用内存和磁盘空间, 这会耗尽光盘的资源!
这是shell脚本的代码:
mkdir /tmp/backUp
mv `find $TOMCATDIR/logs/*.log -mtime +3` /tmp/backUp
cd /tmp/backUp
gzip *
脚本运行后,文件仍然存在于磁盘中(虽然没有打开)
lsof |grep "已删除"
java 584 cg 9w REG 253,7 2253 18317840 /app/jakarta/apache-tomcat-8.0.9_xxx/logs/back06.07/catalina.06-02.log (deleted)
java 584 cg 10w REG 253, 7 881 18317446 /app/jakartaapache-tomcat-8.0.9_xxx/logs/back06.07/localhost.06-02.log (deleted)
.......
....
...
最佳答案
文件从文件系统中删除,其中删除了对该 inode 的任何引用。引用可以在磁盘上(任何目录中的链接),并且..来自打开的应用程序。如果您删除文件 - 您只从磁盘中删除引用,但是 - 仍然有来自应用程序的引用。
您可以通过两种方式“释放”空间:
- 您可以终止打开文件的应用程序。
- 您可以截断文件。
如果您知道 pid - 查看此 pid 打开了哪些文件:ls -l/proc/PID/fd
您会在此处看到如下链接:
undefine@uml:~$ ls -l /proc/18596/fd
razem 0
lrwx------ 1 undefine undefine 64 lut 1 00:06 0 -> /dev/pts/30
lrwx------ 1 undefine undefine 64 lut 1 00:06 1 -> /dev/pts/30
lrwx------ 1 undefine undefine 64 lut 1 00:05 2 -> /dev/pts/30
lr-x------ 1 undefine undefine 64 lut 1 00:06 3 -> /home/undefine/x (deleted)
lr-x------ 1 undefine undefine 64 lut 1 00:06 4 -> anon_inode:inotify
如您所见 - 3 fd 已删除。你可以通过命令截断它(例如):
undefine@uml:~$ :>/proc/18596/fd/3
undefine@uml:~$
请记住,如果应用程序读取此文件 - 这对他们来说可能是危险的。但是 - 如果它只是一个日志文件 - 您可以安全地截断它。
关于linux - 通过带有 gzip 命令的 shell 脚本在 tomcat 服务器中备份日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38099223/