在运行时手动删除日志文件时,bash脚本将stdout和stderr保存在何处?
此脚本生成的日志大约为1G/周。在运行时手动删除日志文件时,bash脚本将stdout和stderr保存在何处?,bash,stdout,stderr,inode,Bash,Stdout,Stderr,Inode,此脚本生成的日志大约为1G/周。 当我在运行时手动删除init.log并且没有重新启动脚本时,它仍然将数据保存在丢失的init.log中。重新启动脚本时,init.log将再次可见 重新启动脚本是否是查看日志的唯一方法?在unix系统上,创建init.log后,将创建一个。每个inodes中都有一个计数器,用于统计对该文件的所有引用。引用是指硬链接或打开文件时的引用。只有当此计数器返回到零时,文件才会被删除 因此,当stdout被重定向到init.log时,其inode的计数器值为2(由目录项引
当我在运行时手动删除init.log并且没有重新启动脚本时,它仍然将数据保存在丢失的init.log中。重新启动脚本时,init.log将再次可见
重新启动脚本是否是查看日志的唯一方法?在unix系统上,创建
init.log
后,将创建一个。每个inode
s中都有一个计数器,用于统计对该文件的所有引用。引用是指硬链接或打开文件时的引用。只有当此计数器返回到零时,文件才会被删除
因此,当stdout被重定向到init.log
时,其inode
的计数器值为2(由目录项引用,并因open
而计数)。当rm
时(使用unlink
函数)删除文件时,此计数器变为1,因此文件未被任何目录项引用,但inode
仍然存在。脚本完成后,计数器变为0,并且inode
被删除
没有简单的方法可以读取未被任何目录项引用的索引节点。只有在没有任何内容引用它时,才会真正删除文件。在这种情况下,您已经删除了所有目录项,但您的程序仍然有一个打开的文件描述符,因此在程序退出之前,数据不会被完全删除。请注意,它还将继续占用磁盘空间 在Linux中,您仍然可以在
/proc/PID/fd/fd
中查看文件的内容,其中PID是进程的id,fd是您感兴趣的文件描述符。一旦程序退出,数据就会被删除,磁盘空间也可以被回收……所以请在可以的时候获取数据;)
如果知道程序上仍然有打开的文件描述符,则不应删除日志文件。相反,使用
cat/dev/null>log.file
或在bash中使用>log.file
来截断文件,谢谢你。现在这是有意义的。它在home/
分区中消耗磁盘空间,而不是/
中可以找到/proc/PID/fd/fd/
的分区
#!/bin/bash
python /home/sites/myapp/Main.py &> /home/sites/myapp/logs/init.log &