用硬链接替换文件到/ dev / null


32

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

如何将它们写入其他日志?

我曾考虑用硬链接(应用程序无法分辨出区别吗?)或指向/ dev / null的硬链接替换log.txt。我有什么选择?


你不能只是chmod -w log.txt
user168715 '16

Answers:


30
# cp -a /dev/null log.txt

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

在内核中根本不知道设备的名称,而是根据它们的主要和次要编号。由于我不知道您使用的是什么操作系统,因此发现仅从我们已经知道的位置复制数字就很方便。如果您使用错误的主,次编号来制造,则很可能已经制造了其他设备,也许是磁盘或其他您不想写入的设备。


4
值得注意的是,此命令需要 sudo(或以root用户身份运行)。请解释(在您的答案中)“正确的主要和次要开发人员编号”是什么意思。
mklement0 '16

3
(我不是OP。)我感谢此次更新,但对于命令中使用的“主要和次要数字”与文件路径之间的关系,我仍然感到困惑/dev/null。而且,我认为这将有助于将来的读者在您的答案中注明sudo所需的内容。
mklement0 '16

1
@wallyk:谢谢,这的确很高兴。但是我的观点是:关于cp -a /dev/null log.txt我的评论如何发挥作用?
mklement0 '16

1
@MALON:确实做到了,在Ubuntu 14.04上,您确实需要sudo执行此命令,除非您碰巧以用户身份运行root(通常不建议这样做)。毕竟,如果必须将文件放置在任何用户帐户都可以写入的位置,那么使用sudo(或运行为root)创建硬链接(此答案)或符号链接(@ V.Michel的答案)可能是正确的解决方案,但要点是:请明确指出该要求。
mklement0 '16

1
PS:我知道主要的,次要的评论可能与对建议使用的问题的评论有关mknod。请注意,注释通常很少受到关注,因此仅阅读问题的人可能会对您的答案感到困惑(就像我一样;也请注意,大多数人从未接触过诸如大号和小号设备号之类的概念)。
mklement0 '16

65

您可以建立到/ dev / null的符号链接,而不必是root:

ln -s /dev/null log.txt

这还具有自我记录的优势,因为这ls -l log.txt将表明它是/ dev / null的符号链接,而不是依赖于知道“ 1、3”在某种意义上是重要的。
蒙蒂·哈德,2016年

14

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

如果包含文件的文件系统不支持设备(例如,该文件是通过选件安装的),则解决方案卷入mknod(或cp -a)将成为问题nodev。当然,跨文件系统的硬链接根本行不通。

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

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

这很像一个硬链接,但是:

  • 它可以跨文件系统运行(因为它不像硬链接一样基于文件系统inode)
  • 它适用于只读文件系统(因为您实际上并未修改文件系统)

举一个完整的例子:

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

但是它仅在具有绑定安装的系统上有效。(例如现代Linux。)
reinierpost,2016年

无论如何,日志文件将不属于只读文件系统。
Monty Harder

1
您会惊奇地发现自己经常想写一个只读文件系统上的单个文件。它很可能在nodev文件系统上。
larsk's

6

关键取决于应用程序如何处理log.txt。

如果应用程序只是打开现有文件并对其进行写入,则按照其他答案中的描述,您可以将其符号链接到/ dev / null,将其符号链接到其他位置,将其硬链接到其他位置(尽管硬链接不能跨文件系统,所以没有)。有很多要点)在此处创建/ dev / null设备节点的副本等。

OTOH,如果应用程序删除并重新创建log.txt,则所有操作均无效。您可以将整个目录符号链接到其他位置,以将写入重定向到其他文件系统,但仅此而已,您就必须处理目录中的其他内容。

我猜想如果您真的想要创建一个自定义的覆盖文件系统,该文件系统可以通过大多数操作,同时放弃创建log.txt文件的任何尝试。


chattr +i log.txt第一次,应用程序将不再删除该文件。
Marco Marsala

3

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

# 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

您几乎可以对转储的日志执行任何操作,例如filter或通过nc发送。


如果cat进程被杀死或崩溃,则当管道已满时,登录程序将挂起。
Marco Marsala

-1

考虑将文件设置为实际的空设备。使用mknod创建的文件“ log.txt”,具有正确的文件类型以及相同的次要和主要数字,将被用作空设备。


这没有增加别人已经说过的话。
库萨兰达
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.