/dev/console 動的リダイレクト

/dev/console 動的リダイレクト

/dev/console送信されたすべてのデータを他のもの(例:- to /dev/null/dev/tty9even)に動的にリダイレクトできますか/dev/null

確信する静的console=XXXカーネル起動パラメータ(または単一プログラムの場合は標準パイプリダイレクト)を介して。問題は、(出力を実行するすべてのプログラムに対して)外部デバイスのデータに基づいてこの作業を動的に実行する必要があることです。

どんな提案がありますか?

ベストアンサー1

いくつかのオプションを考えることができますが、その効果は「コンソール」にどのように入るかによって異なります。

カーネルから生成されたメッセージの場合、最も簡単な方法はdmesg -n 1(ほぼすべての)コンソールメッセージを無効にし、syslogd / klogdを使用してメッセージを抽出および記録または転送することです。コンソールログレベルに関係なく、すべてのカーネルメッセージは引き続き記録され/proc/kmsg(または)経由でアクセスできます。sys_syslog()これに対するバリエーションは、カーネルを起動して出力を抑制し、quietsyslogd printk()/ klogdにのみ依存してカーネルメッセージを処理することです。

より冒険的で包括的なオプションは、以下を使用することです。コンソールモジュールこれは、VMホストがゲストコンソールに直接アクセスできるように、VMゲストと共により一般的に使用されます。持つ2種類、これシステムドライバ(例:x86 PCの「VGA」、カーネル「console =」オプション)。モジュラードライブ必要に応じてロードおよびアンロードすることができ、システムドライバを置き換えることができます。役に立つドライバの1つは次のとおりです。ネットワークコンソール、ロードとアンロードは簡単ですが(システムドライバとモジュラードライバの両方として使用できます)、2つの欠点があります。

  • これは事実ではないtake_over_console()ため、すべてがまだ元のコンソールに移動されます。
  • イーサネット経由でのみ録音します(ループバックはサポートされていません)。

「仮想」コンソールと上記のオプションのいずれかを使用して便利な作業を実行できます。netcatまたは、socatWebコンソールに適した「クライアント」を作成します。

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セッションで実行することもできます。このように

おすすめ記事