Linux中文件执行中的锁定怪现象解释

本来今天不准备开电脑了,太困了,想睡觉,然而一哥们儿短信都发过来了,要问个问题,于是还是打开了电脑,没想到是一个很有代表性的问题,顺便也牵扯了前些天我的工作中的一个bug,值得记录下来。问题如下:

linux下,一个可执行文件exe1正在执行中,rm –f可以将其删除,mv可以将其移除,mv $other exe1也可以将其替换,但是cp $other exe1则显示文件忙,求解。

这实际上并不是一个真正的问题,因为只要你的基础知识扎实,这个问题显然很简单,原因只有一个,那就是linux文件基于引用计数。现在问题是这些个命令如何来操作一个文件的引用计数。下面的讨论都是基于独占打开的模式。

如果一个文件已经被打开,那么它的引用计数会增加1,如果调用了rm,实际上底层只是unlink了一下,也就是说将它的引用计数减少1,这样虽然你在界面上(命令行或者GUI)看不到它了,但是它被打开时的计数还在,只有当它被关闭的时候,引用计数变为0,才彻底删除它。

再说mv命令,它实际上只是一个源文件的rename而已,如果mv的目标本来就存在,那么在目标上执行一个类似rm的效果,也就是unlink一下,结合引用计数的理论,目标文件如果已经被打开,那么当关闭的时候将不复存在,如果本来就没有被打开,那么mv的时候,目标直接被删除,因为unlink之后,它的引用计数变成了0。

最后看一下cp命令,cp的话并不触动源文件和目标文件元数据本身(时间戳除外),它只是打开源文件和目标文件,在源文件上执行read,然后将结果write到目标文件,实质上是一个IO操作,对于可执行文件,是独占打开的,并不允许写入,因此会出错。

这里就不再列出内核源码了,可以自行参考系统调用的实现而加深理解,不过最好别干巴巴的看,还是结合strace以及objdump比较好,要知道是怎么以及什么时候调用的,以及调用参数是什么,否则就和八股文没区别了。那么这和我工作中的bug有什么关系呢?这个bug源于OpenVPN的日志记录,并且配置了日志回滚,回滚配置文件关键字段如下:

size 4M

missingok

rotate 9

compress

delaycompress

create 644 xx xx

结果当日志回滚成了vpn.log.1之后,这个vpn.log.1依然继续被写入。这个原因正是rename造成的。在logrotate的man页面中,有一个copytruncate配置,其含义就是不进行rename,而只是copy,然后将原来的文件truncate,加入这个就可以了。

千万不要小看这些很简单的命令,真正理解的人并不多,即使真正的理解,出现问题,能真正对应到原理也不多,很简单的东西如果能彻底做到透彻的理解并且活用,再往深入学习才是有意义的。

(0)

相关推荐

  • Linux中文件执行中的锁定的怪现象

    本来今天不准备开电脑了,太困了,想睡觉,然而一哥们儿短信都发过来了,要问个问题,于是还是打开了电脑,没想到是一个很有代表性的问题,顺便也牵扯了前些天我的工作中的一个bug,值得记录下来。问题如下: l ...

  • Linux系统中查看执行中的进程占用内存量的方法

    Linux中查看某个进程占用内存的情况,执行如下命令即可,将其中的[pid]替换成相应进程的PID号: 复制代码 代码如下: cat /proc/[pid]/status 说明/proc/[pid]/ ...

  • Linux 从进程相关的文件描述中恢复数据

    在Linux中误删除了某个文件,但是 ps-ef|grep 文件名 发现某个进程还在使用该文件,那么可以通 过以下方式恢复文件。 例如: 创建一个简单文件/tmp/test.txt, 随便向里面写点内 ...

  • Linux系统递归生成目录中文件的md5的方法

    这篇文章主要介绍了Linux系统递归生成目录中文件的md5的方法,利用PHP脚本实现,需要的朋友可以参考下 linux下使用md5sum递归生成整个目录的md5 今天要用md5sum操作目录,递归生成 ...

  • Powershell中命令执行结果以文件形式输出方法

    相信很多小伙伴都有运用过"Powershell程序和命令提示符",那么其中的命令执行结果我们怎么以文件形式输出呢?下面小编就来为大家具体介绍.具体如下:1. 首先我们打开" ...

  • ubuntu系统中文件和内容查找命令小结

    一.以文件名查找: 1. find 命令 由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络文件系统( NFS),find命令在该文件系统中同 ...

  • 在Linux的命令行中实现字符出现频率统计的方法

    Linux 命令行有很多的乐趣,我们可以很容易并且完善地执行很多繁琐的任务.比如,我们计算一个文本文件中字和字符的出现频率,这就是我们打算在这篇文章中讲到的. 立刻来到我们脑海的命令,计算字和字符在一 ...

  • 清除Win8升级后系统盘windows.old文件夹中的老旧系统备份文件

    有些朋友从旧版本Windows系统升级到Windows 8后会感觉系统盘空间占用比较大,这是因为Win8升级过程中会将之前的系统文件自动备份存储在Windows.old文件夹中,这个文件夹的体积从几 ...

  • Office2010中"文件"界面的详细介绍

    用惯了Office2007的朋友们都应该知道,在Office程序中左上方有个“Office按钮”,我们单击进入“Office按钮”后可以使用一些很常用的功能和操作,比如:打开、新建、保存、关闭等这些比 ...