我们正在将网站从一个服务器配置转移到新配置,并且网站将以不同于以前的路径生活.我们正计划努力通过新路径替换旧路径,但是如果我们错过任何路径,是否有某种方法可以监控任何尝试访问旧路径的进程,还知道流程所拥有的UID是什么?
解决方法:
您可以使用这个小的systemtap脚本:
#!/usr/bin/stap
function proc:string() { return sprintf("PID(%d) UID(%d) PROC(%s)", pid(), uid(), execname()) }
probe syscall.open.return, syscall.stat.return,
syscall.open64.return ?, syscall.stat64.return ? {
filename = user_string($filename)
if ($return < 0) {
printf("failed %s on %s by %s\n", pn(), proc(), filename)
}
}
它将挂钩系统调用open和stat(你可以复制/粘贴代码,也许我忘了一些其他系统调用)返回.由于系统调用是与内核通信的唯一方式,因此您不会错过任何内容.
这个脚本会产生这种输出:
failed syscall.stat.return on PID(4203) UID(1000) PROC(bash) by /tmp/rofl
failed syscall.stat.return on PID(4203) UID(1000) PROC(bash) by /tmp/hihi
在使用systemtap的专业人士中,我们有:
>这个过程不那么突兀
>系统范围(不仅是受监控的进程),但您可以直接在脚本中减少其选择
>减少资源饥饿(仅显示失败的操作,而不是全部为grep)
>您可以改进脚本以获取有关调用程序的详细信息(例如,其回溯,通话时间等).这取决于您的应用程序.
对于缺点:
>不标准,你必须安装它(但标准足以在大多数发行版上可用).在Redhat&变种:sudo yum install systemtap
>需要使用debuginfos来构建模块.在Redhat&变种:sudo debuginfo-install kernel
一些有用的链接:The tapset (included functions) index和beginners guide
祝你好运!