本来今天不准备开电脑了,太困了,想睡觉,然而一哥们儿短信都发过来了,要问个问题,于是还是打开了电脑,没想到是一个很有代表性的问题,顺便也牵扯了前些天我的工作中的一个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,加入这个就可以了。
千万不要小看这些很简单的命令,真正理解的人并不多,即使真正的理解,出现问题,能真正对应到原理也不多,很简单的东西如果能彻底做到透彻的理解并且活用,再往深入学习才是有意义的。
分享到:
相关推荐
Linux中文件执行中的锁定怪现象解释.docx
Linux中文件执行中的锁定的怪现象.docx
linux下独立程序执行php文件,一个二进制文件,不依赖系统其他文件,可以解释执行php文件
linux /etc/profile 文件的改变会涉及到系统的环境,也就是有关 Linux 环境变量的东西,学习 Linux 要了解 Linux profile 文件的相关原理, 这里对则以文件进行具体分析
在win下读取linux分区中文件的工具
自己设定了一堆abaqus作业命令,本来在window服务器下可以运行,但是,毕竟自己的电脑计算能力有限,这时候要用上服务器了,但是在使用过程中发现无法像window系统一样双击一下bat文件就可以批量执行,因此我制作了...
1、在内存中开辟一块空间来模拟文件系统的运行,不读写硬盘。 2、面向单用户、单任务,不考虑并发,不考虑文件属主、组等概念。 3、程序开始后,初始化并接收用户输入。若输入”enter”,则重新建立文件系统, 读取...
linux系统 arm版本查询执行文件运行时依赖哪些库文件及其路径,在运行执行文件出错和移植第三方库的时候比较有用
详细介绍python工程打包成linux可执行文件
Linux中查找文件的命令通常为“find”命令,“find”命令能帮助我们在使用, 管理Linux的日常事务中方便的查找出我们需要的文件。对于Linux新手来说,“find” 命令也是了解和学习Linux文件特点的方法。因为Linux...
有时候需要在Linux kernel--大多是在需要调试的驱动程序--中读写文件数据。在kernel中操作文件没有标准库可用,需要利用kernel的一些函数,这些函数主要有:filp_open() filp_close(), vfs_read() vfs_write(),set_...
下面小编就为 大家带来一篇linux 不删除文件,清空文件中内容的命令。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
linux下文件的打包可执行文件以及测试
3.Linux中的文件分类 (1)普通文件 文本文件:采用ASCII编码方式,可编辑,可修改 二进制:不可查看,不可修改 (2)目录文件 存放的内容是目录中的文件名和子目录名 (3)设备文件(/dev)
文件系统指文件存在的物理空间,linux系统中每个分区都是一个文件系统,都有自己的目录层次结构。linux会将这些分属不同分区的、单独的文件系统按一定的方式形成一个系统的总的目录层次结构。一个操作系统的运行离不...
Linux常用文件命令,这是Linux中的常用文件命令,可以调用Linux常用的基本文件命令
Linux中统计文件大小
实现Linux与windows文件互传,用HTML实现网页版上传文件下载的界面,目前配置是Linux服务器,本地运行需要切换配置
linux文件操作 linux操作系统 文件操作 常用命令 系统命令