只是为了好玩:
有没有办法监视/捕获/转储正在写入的内容/dev/null
?
在 Debian 或 FreeBSD 上,如果重要的话,也欢迎任何其他操作系统特定的解决方案。
答案1
制作/dev/null
命名管道可能是最简单的方法。请注意,某些程序(sshd
例如)在发现它不是特殊文件时(或者它们可能从 读取/dev/null
并期望它返回EOF
)将出现异常或无法执行。
# Remove special file, create FIFO and read from it
rm /dev/null && mkfifo -m622 /dev/null && tail -f /dev/null
# Remove FIFO, recreate special file
rm /dev/null && mknod -m666 /dev/null c 1 3
这应该可以在所有 Linux 发行版和所有主要 BSD 下运行。
答案2
我曾经艰难地发现 /dev/null 没有有成为一个特殊的开发文件。很久以前,工作中的 Ultrix 系统上的 /dev/null 被删除,因此下次程序重定向到 /dev/null 时,它最终会成为一个充满该程序输出的普通文件。 (我认为这是“没有这样的文件或目录”,这意味着当我们试图弄清楚发生了什么时,我们会这样做cat /dev/null
并被告知,no such file or directory
这让我们非常困惑。)
因此,我的建议是将其替换为命名管道,然后将一个程序附加到该管道来读取并监视它。
答案3
我想到一个想法,其中 /dev/null 可以是文件描述符的符号链接,但使用添加代码机制来确定操作是读取还是写入,然后如果读取它,它实际上应该从单独创建的 /dev/actualnull 读取mknod 并且如果它是写入的,则记下调用程序并尝试记录/计数以分析使用 /dev/null 进行写入的程序。但我认为这在性能方面会付出很大的代价。我想这是不切实际的,因为大多数 shell 程序或代码无论如何都使用重定向。可以使用 inotify 来监视 /dev/null 的使用情况吗?或者重写处理1:3设备的内核代码,再次编译并重新安装,可实验。