#指尖人生#Linux系统服务—logrotate

Linux 文件操作机制

介绍一下相关的 Linux 下的文件操作机制。

Linux 文件系统里文件和文件名的关系如下图。

目录也是文件,文件里存着文件名和对应的 inode 编号。通过这个 inode 编号可以查到文件的元数据和文件内容。文件的元数据有引用计数、操作权限、拥有者 ID、创建时间、最linux操作系统基础知识后修改时间等等。文件路径不存在怎么解决文件件名并不在元数据里而是在目录文件中。因此文件改名、移动,都不会修改文件,而是修改目录文件。

借《UNlinux重启命令IX 环境高级编程》里的图说一下进程打开文件的机制。


                                            #指尖人生#Linux系统服务---logrotate

进程每新打开一个文件,系统会分配一linux是什么操作系统个新的文件描述符给这个文件。文件描述符对应着一个文qq文件路径件表。表里面存着文件的状态信息(​​O_APPEND​​​/​​O_CREAT​​​/​​O_DIRECT​​...)、当前文件位置和文件的 i文件名无效是怎么回事node 信息。系统会为每个进程创建独立的文件描述符日志文件在哪和文件表,不同进文件路径怎么找程是不会共用同一个文件表。正因为如此,不同进程可以同时用不同的状系统运维工程师态操作同一个文件的不同位置。文件表中存的是 inode 信息而不是文件路径,所以文件路径文件路径发生改变不会影响文文件路径有哪两种表示方法件操作。

logrotate原理

logrotate 是怎系统运维工程师么做linux到滚动日志时不影响程序正常的日志linux输出呢?logrotate 提供了两文件名的命名规则是什么种解决方案。

1、create

这也就是默认的方案,可以通过 cr日志文件是用于记录什么eate 命令配置文件的权限和属组设置;这个方案的思路是重命名原日志文件,创建新的日志文件。详细步骤如下:

  1. 重命名正在输出日志文件,因为重命名只修linux删除文件命令改目录以及文件的名称,而进程操作文件使用的是 inode,所以并不影响原程序继续输出日志。
  2. 创建新的日志文件,文件名和文件路径乱码怎么处理原日志文件一样,注意,此时只是文件名称一样,而 inode 编号不同,原程序输出linux是什么操作系统的日志还是往原日志文件输出。
  3. 最后通过某些方式文件路径有哪两种表示方法通知程序,重新打开日linux命令志文件;由于重新打开文件路径超出系统限制无法下载日志文件会用到文件路径而非 inode 编号,所以打开的是新的日志文件。

如上也就是 logrotate 的默认操作方式,也就是 mv+create 执行完之后,通知应用重新在新文件写入即可。mv+create 成本都比较低,几乎是原子操作,如果应用支持重新打开日志文件,如 syslog, nginx, mysql 等,那么这文件名的命名规则是什么是最好的方式。

不过,有些程序并不支持这种方式,压文件名根没日志文件在哪有提供重新打开日志的接口;而如果重启应用程序,必然会降低可用性,为此引入了如日志文件是用于记录什么下方式。

2、copytruncate

该方案是把正在输出的日志拷 (copy) 一份出来,再清空 (trucate) 原来的日志;详细步骤linux删除文件命令如下:

  1. 将当前正在输出的日志文件复制为目标文件,此时程序仍然将日志输出到原来文件中,此时,原文件名也没有变。
  2. 清空日志文件,原程序仍然还是输出到预案日志文件中,因为清空文件只把文件的内容删除了,而 inode 并日志文件可以删除吗没改变,后续日志的输出仍然写入该文件中。

如上所述,对于 copytruncate 也就是先复文件名无效是怎么回事制一份文件,然后清空原有文件。

通常来说,清空操作比较快,但是如果日志文件太大,那么复制就会比文件路径乱码怎么处理较耗时,从而可能导致部分日志丢失。不过这种方式不需要应用程序的支持即可。