yum -y install systemtap systemtap-runtime kernel-debuginfo-`uname -r` kernel-debuginfo-common-`uname -i`-`uname -r` kernel-devel-`uname -r`
Our target file will be /test:
touch /test
Let's get its inode:
ls -i /test
274
Using "mount" found the device the file resides on and find it's major and minor numbers: In my case it's:
ll /dev/md-0
brw-rw----. 1 root disk 253, 0 Apr 17 10:23 /dev/dm-0
Now create the following file:
cat filechange.stp
#!/usr/bin/env stap
global ATTR_MODE = 1
probe kernel.function("setattr_copy")!,
kernel.function("generic_setattr")!,
kernel.function("inode_setattr") {
dev_nr = $inode->i_sb->s_dev
inode_nr = $inode->i_ino
if (dev_nr == MKDEV($1,$2) # major/minor device
&& inode_nr == $3
&& $attr->ia_valid & ATTR_MODE)
printf ("%d %s(%d) %s 0x%x/%u %o %d\n",
gettimeofday_us(), execname(), pid(), probefunc(),
dev_nr, inode_nr, $attr->ia_mode, uid())
}
And run it in a screen session or something:
stap -v filechange.stp 253 0 274
After some time...
1334676922011223 chmod(6157) generic_setattr 0xfd00000/274 100600 0
...BUSTED! The fist one is timestamp, the second one is process name(pid).