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

sa2*_*289 4 linux monitoring files

我们正在将网站从一种服务器配置迁移到新配置,并且这些网站将采用与以前不同的路径。我们计划仔细检查并用新路径替换旧路径,但如果我们错过任何路径,是否有某种方法可以监视任何试图访问旧路径的进程,并且还知道该进程所属的 UID 是什么?

Adr*_* M. 6

您可以使用这个小 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)
  }
}
Run Code Online (Sandbox Code Playgroud)

它将在返回时挂钩系统调用 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
Run Code Online (Sandbox Code Playgroud)

在使用 systemtap 的优点中,我们有:

  • 对过程的干扰较小
  • 系统范围内(不仅是受监控的进程),但您可以直接在脚本中减少其选择
  • 更少的资源饥饿(只显示失败的操作,而不是所有的 grep 之后)
  • 您可以改进脚本以获取有关调用程序的详细信息(例如,其回溯、调用时间等...)。这取决于您的应用程序。

对于缺点:

  • 不是标准的,你必须安装它(但标准足以在大多数发行版上可用)。在 Redhat 和变体上:sudo yum install systemtap
  • 需要有 debuginfos 来构建模块。在 Redhat 和变体上:sudo debuginfo-install kernel

一些有用的链接:tapset(包含的函数)索引初学者指南

祝您移民顺利!