unix 文件已损坏

asa*_*asa 2 files

我发现我的一个日志占用了大量来自正在运行的进程的空间。我想清理这个文件,所以我可以运行 logadm 来旋转它。但我不知道如何

# >MyLog_nohup.out
# ls -lLh MyLog_nohup.out
-rw-r-lr--   1 user     group       72G Jul 30 07:26 MyLog_nohup.out
# du -sh MyLog_nohup.out
480K   MyLog_nohup.out
Run Code Online (Sandbox Code Playgroud)

即使在释放它之后,仍然消耗 72G,并在其上运行更多,只是显示空行.. 我该如何解决?

我负担不起重新开始这个过程。但是我想使用 logadm 来轮换这个日志文件,这可能吗?我试过了,但它一直在无限循环地处理空白行。和我在这个文件上做更多的时候一样。有没有其他方法可以解决这个问题?

对于 logrotate,有处理打开文件的 copytruncate 选项,但是当文件在循环中运行时有这些空行时,我无法使用它。我还是不明白为什么我不能查看/更多/头部这个文件!

Bas*_*tch 5

您的文件没有损坏;在 Linux 和 POSIX 系统上,只要一个正在运行的进程有一个打开的文件描述符到它正在写入的某个文件,它就能够继续写入它,即使您删除或重命名该文件(因为文件描述符与一个i-node,而不是文件名)。特别是logrotatelogadm- 或任何外部命令序列 - 不会对磁盘​​空间做任何有用的事情。

我假设您使用的是 Linux。

如果您的进程的 pid 为 1234,您可以查看/proc/1234/特别列出的/proc/1234/fd/目录。阅读proc(5)

您可能应该停止有问题的进程(使用kill -TERMthenkill -QUIT最后kill -KILL;参见signal(7) & kill(1)),然后删除文件,最后更正和/或配置您的程序以执行一些更有用的日志,然后开始再说一遍。

您可能已经丢失了程序完成的所有计算。所以最好尽快停止它,改进它(也许你想要一些应用程序检查点持久性,或者添加一些方法来关闭它,然后重命名,然后重新打开日志文件),并重新启动你的程序的改进版本。

你应该阅读高级 Linux 编程。您的程序中可能有几个错误(可能与日志记录有关)。您可以使用strace(1)来了解您的进程完成的系统调用,并且您可以在您的(改进的)程序中使用syslog(3)

很可能,您的程序中存在设计错误。所以最好现在停止它,思考,改进它,然后重新开始。等待磁盘完全填满对您没有帮助(而且会使情况变得更糟)。

为了将来的测试目的,您可能会考虑设置一些磁盘配额和/或一些资源限制(例如setrlimit(2)和 bashulimit内置)。

将来,始终将您的程序设计为能够负担得起重新启动该过程。负担不起这总是一个巨大的错误(特别是,您需要一些备份策略,并且需要对源代码进行一些修订控制;为此我推荐git)。