_/dev/console
_に送信されたすべてのデータを他の何かに動的にリダイレクトすることは可能ですか(たとえば、-_/dev/null
_、_/dev/tty9
_、さらには_/dev/null
_)?
もちろん、それは_console=XXX
_カーネルブートパラメータ(または単一プログラムの場合は標準のパイプリダイレクト)を介して静的実行できます。問題は、外部デバイスからのデータに基づいて、動的に(および出力を行うすべてのプログラムに対して)実行する必要があることです。
助言がありますか?
私が考えることができるいくつかのオプションがあります、それらの有効性は物事が「コンソール」にどのように進むかに依存します。
カーネルソースメッセージの場合、最も簡単なのは_dmesg -n 1
_を使用して(実質的にすべての)コンソールメッセージを無効にし、syslogd/klogdを使用してそれらを抽出してログに記録するか転送することです。すべてのカーネルメッセージは引き続きログに記録され、コンソールのログレベルに関係なく、_/proc/kmsg
_(またはsys_syslog()
)を介してアクセスできます。これのバリエーションは、printk()
出力を抑制するquiet
でカーネルを起動し、カーネルメッセージの処理をsyslogd/klogdのみに依存することです。
より冒険的で包括的なオプションは、コンソールモジュールを使用することです。これらは、一般的にVMゲストで使用されるため、 VMホストはゲストコンソールに直接アクセスできます。 2つのタイプ 、システムドライバー(例:x86 PCの「VGA」、カーネルの「console =」オプション)、およびモジュラードライバー必要に応じてロードおよびアンロードできます。 、およびシステムドライバーを引き継ぐ可能性があります。1つの可能性のあるドライバーは netconsole ですが、簡単にロードおよびアンロードできます(システムドライバーとモジュール式ドライバーの両方として使用できます)。
take_over_console()
ではないので、すべてが元のコンソールに移動します「ダミー」コンソールと上記のオプションの1つを使用すると、何か便利なことができる場合があります。 netcat
またはsocat
をネットコンソールの「クライアント」にしてください:
_modprobe netconsole "[email protected]/eth0,[email protected]/ff:ff:ff:ff:ff:ff"
socat UDP4-LISTEN:55514 -
_
個々のシステムサービスからコンソール出力をキャプチャすることに興味がある場合は、スクリプトを変更しない簡単な方法はないと思います。
これを行うための単純ではない(そしておそらくニースではない)方法には、LD_PRELOADを使用して ハイジャック 出力を生成する関数をリダイレクトするか、__init
_コードを追加してデフォルトのファイル記述子を修正します。さらに悪いことに、デバッガーを使用して接続し、 開いているファイル記述子を操作する 。 _/etc/ld.so.preload
_は、最初のオプションを実装する簡単な方法(ハックでやや厄介な場合)です。
デーモンのコンソール出力を監視したい場合は、おそらくスタートアップスクリプトを修正して、screen
セッションで実行するようにします(おそらく like like )。