linux动态重定向文件,linux – / dev / console动态重定向

是否可以动态地将发送到/ dev / console的所有数据重定向到其他内容(例如 – 到/ dev / null,/ dev / tty9甚至/ dev / null)?

当然,它可以通过console = XXX内核引导参数(或单个程序的标准管道重定向)静态完成.问题是我需要根据来自外部设备的数据动态地(以及所有输出的程序)执行此操作.

有什么建议?

解决方法:

我可以想到几个选项,它们的有效性取决于事物如何进入“控制台”.

对于内核源消息,最简单的方法是使用dmesg -n 1来禁用(几乎所有)控制台消息,并使用syslogd / klogd来提取并记录它们或转发它们.无论控制台日志级别如何,所有内核消息仍会被记录并可通过/ proc / kmsg(或sys_syslog())访问.对此的一个变体是使用quiet来启动内核,这会抑制printk()输出,并且仅依赖syslogd / klogd来处理内核消息.

更具冒险性和全面性的选择是使用控制台模块,这些模块在VM guest虚拟机中更常用,以便VM主机可以直接访问guest虚拟机控制台.有two types,系统驱动程序(例如x86 PC上的“VGA”,内核“console =”选项);和模块化驱动程序,可以根据需要加载和卸载,并可以接管系统驱动程序.一个可能有用的驱动程序是netconsole,虽然它很容易加载和卸载(它可以用作系统和模块化驱动程序),但有两个缺点:

>它没有take_over_console()所以一切都仍然进入原始控制台

>它只通过以太网记录(不支持环回)

您可以使用“虚拟”控制台以及上面的选项之一执行一些有用的操作. netcat或socat为netconsole做好“客户”:

modprobe netconsole "netconsole=55514@10.0.2.15/eth0,6667@10.1.2.3/ff:ff:ff:ff:ff:ff"

socat UDP4-LISTEN:55514 -

如果您对从单个系统服务捕获控制台输出更感兴趣,那么我认为没有脚本修改的简单方法.

这样做的不简单(也可能不是很好)包括使用LD_PRELOAD来劫持生成输出的重定向函数,或添加一些_init代码来修改默认文件描述符.或者更糟糕的是:附加一个调试器和manipulating the open file descriptors. /etc/ld.so.preload将是一个简单的(如果是hackish和稍微讨厌)实现第一个选项的方式.

如果我想监视守护进程的控制台输出,我可能会修改启动脚本以在屏幕会话中运行它们,也许是like so.

标签:linux,console,embedded

来源: https://codeday.me/bug/20190813/1648140.html