2008-03-04

谁动了我的奶酪?

一段脚本的行为并不似预期的那样执行,后来发现原因在于/var/lock/文件夹下的文件在关机时会被自动删除:随便touch一个文件放那儿,重启,它就没了。试了一下,不仅是rPath,FC,ArchLinux,Ubuntu,也都是如此。而FreeBSD里则没这个文件夹。

究竟什么时候,是哪个程序执行了这个删除动作呢?查了下FHS的文档,没有答案。于是grep所有位于/etc/init.d/下的脚本,似乎也没有什么收获。后来一共想了三种方法,也没找到答案。思考中。
  1. lsof
    写了个脚本不断的循环调用lsof|grep,一无所获。想想也是,执行一个删除只要unlink就完事了,不会open这个文件。而且从调度器的角度来想,这个办法实在不高明
  2. inotify
    写个inotify程序监视/var/lock/下的文件是很简单的,不过inotify只能监测到各种文件操作的事件,却不能知道事件的发起者
  3. jprobe
    用内核模块劫持sys_unlink看看current->comm究竟是谁。用这个方法可以清楚的看见同时按ctrl-shift-delete 时,firefox究竟删除了那些文件,也可以看见/var/lock/subsys/下的文件是rm命令删除的。却死活没看见自己在/var/lock 下touch的文件是怎么删除的,诡异。
很久没写这些程序,发现inotify不用再打开/dev/inotify了,而结构体kprobe中也多了个成员变量symbol_name,不仅感叹,失去的一些东西终于是失去了。

4 Comments:

At 22:58, Blogger YY© said...

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 ...

 
At 23:15, Blogger YY© said...

最后一句好意味深长

 
At 23:54, Blogger David Lee said...

Good catch! 晚上也想到这可能是启动时发生的事情,因为没道理文件会无缘无故从磁盘上消失而不经过sys_unlink().

Thanks for this URL anyway. :)

 
At 10:32, Blogger David Lee said...

下了sysvinit的源代码,没有发现那些删除文件的操作;这篇suse-linux-internals似乎颇老了,刚刚查了一下,这些cleanup的动作是在脚本/etc/rc.sysinit里面完成的。当然,这个脚本确实是init程序调用了的。-_-

 

发表评论

<< Home