Answers:
# cp -a /dev/null log.txt
这会将具有正确的主要和次要开发编号的空设备复制到,log.txt
以便您拥有另一个null
。
在内核中根本不知道设备的名称,而是根据它们的主要和次要编号。由于我不知道您使用的是什么操作系统,因此发现仅从我们已经知道的位置复制数字就很方便。如果您使用错误的主,次编号来制造,则很可能已经制造了其他设备,也许是磁盘或其他您不想写入的设备。
sudo
(或以root用户身份运行)。请解释(在您的答案中)“正确的主要和次要开发人员编号”是什么意思。
/dev/null
。而且,我认为这将有助于将来的读者在您的答案中注明sudo
所需的内容。
cp -a /dev/null log.txt
我的评论如何发挥作用?
sudo
执行此命令,除非您碰巧以用户身份运行root
(通常不建议这样做)。毕竟,如果必须将文件放置在任何用户帐户都可以写入的位置,那么使用sudo
(或运行为root
)创建硬链接(此答案)或符号链接(@ V.Michel的答案)可能是正确的解决方案,但要点是:请明确指出该要求。
mknod
。请注意,注释通常很少受到关注,因此仅阅读问题的人可能会对您的答案感到困惑(就像我一样;也请注意,大多数人从未接触过诸如大号和小号设备号之类的概念)。
您可以建立到/ dev / null的符号链接,而不必是root:
ln -s /dev/null log.txt
ls -l log.txt
将表明它是/ dev / null的符号链接,而不是依赖于知道“ 1、3”在某种意义上是重要的。
这里的其他答案可能会起作用。特别是,符号链接解决方案可能将是最简单的解决方案。我提供此内容主要是为了完整性。
如果包含文件的文件系统不支持设备(例如,该文件是通过选件安装的),则解决方案卷入mknod
(或cp -a
)将成为问题nodev
。当然,跨文件系统的硬链接根本行不通。
硬链接或创建新设备节点的一种替代方法是使用绑定安装,它使您可以将文件或目录从文件系统树的一部分安装到另一部分。因此,例如,您可以运行:
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
nodev
文件系统上。
关键取决于应用程序如何处理log.txt。
如果应用程序只是打开现有文件并对其进行写入,则按照其他答案中的描述,您可以将其符号链接到/ dev / null,将其符号链接到其他位置,将其硬链接到其他位置(尽管硬链接不能跨文件系统,所以没有)。有很多要点)在此处创建/ dev / null设备节点的副本等。
OTOH,如果应用程序删除并重新创建log.txt,则所有操作均无效。您可以将整个目录符号链接到其他位置,以将写入重定向到其他文件系统,但仅此而已,您就必须处理目录中的其他内容。
我猜想如果您真的想要创建一个自定义的覆盖文件系统,该文件系统可以通过大多数操作,同时放弃创建log.txt文件的任何尝试。
chattr +i log.txt
第一次,应用程序将不再删除该文件。
好吧,一种不适合使用命名管道的方法:
# 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
进程被杀死或崩溃,则当管道已满时,登录程序将挂起。
chmod -w log.txt
?