linux – 监视尝试访问不存在的文件或目录的进程

我们正在将网站从一个服务器配置转移到新配置,并且网站将以不同于以前的路径生活.我们正计划努力通过新路径替换旧路径,但是如果我们错过任何路径,是否有某种方法可以监控任何尝试访问旧路径的进程,还知道流程所拥有的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) indexbeginners guide

祝你好运!

上一篇:linux – 使用Web界面监控服务器的最佳/好工具?


下一篇:linux – 监视文件系统活动