将文件替换为 /dev/null 的硬链接

将文件替换为 /dev/null 的硬链接

我正在运行一个写入 log.txt 的应用程序。该应用程序已更新到新版本,使得支持的插件不再兼容。它强制将大量错误写入 log.txt,并且似乎不支持写入不同的日志文件。

如何将它们写入不同的日志?

我考虑过用硬链接替换 ​​log.txt (应用程序无法区分差异,对吗?)或指向 /dev/null 的硬链接。我有什么选择?

答案1

您可以创建到 /dev/null 的符号链接,并且不需要是 root:

ln -s /dev/null log.txt

答案2

# cp -a /dev/null log.txt

这将使用正确的主要和次要开发编号复制您的空设备,以便log.txt您拥有另一个null.

设备在内核中根本无法通过名称来识别,而是通过其主设备号和次设备号来识别。因为我不知道你有什么操作系统,所以我发现从我们已经知道的地方复制数字很方便。如果您使用错误的主设备号和次设备号,您很可能制作了其他设备,可能是磁盘或您不想写入的其他设备。

答案3

这里的其他答案可能会起作用。特别是,符号链接解决方案可能是最简单的解决方案。我提供这个主要是为了完整性。

如果包含该文件的文件系统不支持设备(例如,它是使用该选项安装的),那么涉及mknod(或)的解决方案就会出现问题。当然,跨文件系统的硬链接根本不起作用。cp -anodev

硬链接或创建新设备节点的替代方法是使用绑定挂载,它允许您将文件或目录从文件系统树的一部分挂载到另一部分。因此,例如,您可以运行:

mount -o bind /dev/null /path/to/log.txt

这很像硬链接,但是:

  • 它可以跨文件系统操作(因为它不像硬链接那样基于文件系统索引节点)
  • 它适用于只读文件系统(因为您实际上并未修改文件系统)

一个完整的例子:

bash-4.3# ls -l /var/log/boot.log
-rw-r--r--. 1 root root 7436 Dec 19 10:00 /var/log/boot.log
bash-4.3# mount -o bind /dev/null /var/log/boot.log
bash-4.3# ls -l /var/log/boot.log
crw-rw-rw-. 1 root root 1, 3 Dec 19 09:58 /var/log/boot.log
bash-4.3# echo words words words > /var/log/boot.log
bash-4.3# ls -l /var/log/boot.log
crw-rw-rw-. 1 root root 1, 3 Dec 19 09:58 /var/log/boot.log

答案4

好吧,一种使用命名管道的不优雅方法:

# create a named pipe
mkfifo /path/to/log.txt
# read contents from the pipe and redirect them to /dev/null
cat /path/to/log.txt > /dev/null

您几乎可以对转储的日志执行任何操作,例如过滤或发送数控

相关内容