谁动了我的奶酪?
一段脚本的行为并不似预期的那样执行,后来发现原因在于/var/lock/文件夹下的文件在关机时会被自动删除:随便touch一个文件放那儿,重启,它就没了。试了一下,不仅是rPath,FC,ArchLinux,Ubuntu,也都是如此。而FreeBSD里则没这个文件夹。
究竟什么时候,是哪个程序执行了这个删除动作呢?查了下FHS的文档,没有答案。于是grep所有位于/etc/init.d/下的脚本,似乎也没有什么收获。后来一共想了三种方法,也没找到答案。思考中。
- lsof
写了个脚本不断的循环调用lsof|grep,一无所获。想想也是,执行一个删除只要unlink就完事了,不会open这个文件。而且从调度器的角度来想,这个办法实在不高明
- inotify
写个inotify程序监视/var/lock/下的文件是很简单的,不过inotify只能监测到各种文件操作的事件,却不能知道事件的发起者
- jprobe
用内核模块劫持sys_unlink看看current->comm究竟是谁。用这个方法可以清楚的看见同时按ctrl-shift-delete 时,firefox究竟删除了那些文件,也可以看见/var/lock/subsys/下的文件是rm命令删除的。却死活没看见自己在/var/lock 下touch的文件是怎么删除的,诡异。
4 Comments:
it should be done by `init'.
refer to http://linuxmafia.com/pub/linux/suse-linux-internals/chapter6.html
BTW: I found in RH 7.3 (linux-2.4.xx), there is a script named bootclean.sh under /etc/init.d, which will cleanup /var/lock, /var/run ...
最后一句好意味深长
Good catch! 晚上也想到这可能是启动时发生的事情,因为没道理文件会无缘无故从磁盘上消失而不经过sys_unlink().
Thanks for this URL anyway. :)
下了sysvinit的源代码,没有发现那些删除文件的操作;这篇suse-linux-internals似乎颇老了,刚刚查了一下,这些cleanup的动作是在脚本/etc/rc.sysinit里面完成的。当然,这个脚本确实是init程序调用了的。-_-
发表评论
<< Home