/dev/console
送信されたすべてのデータを他のもの(例:- to /dev/null
、/dev/tty9
even)に動的にリダイレクトできますか/dev/null
?
確信する静的console=XXX
カーネル起動パラメータ(または単一プログラムの場合は標準パイプリダイレクト)を介して。問題は、(出力を実行するすべてのプログラムに対して)外部デバイスのデータに基づいてこの作業を動的に実行する必要があることです。
どんな提案がありますか?
ベストアンサー1
いくつかのオプションを考えることができますが、その効果は「コンソール」にどのように入るかによって異なります。
カーネルから生成されたメッセージの場合、最も簡単な方法はdmesg -n 1
(ほぼすべての)コンソールメッセージを無効にし、syslogd / klogdを使用してメッセージを抽出および記録または転送することです。コンソールログレベルに関係なく、すべてのカーネルメッセージは引き続き記録され/proc/kmsg
(または)経由でアクセスできます。sys_syslog()
これに対するバリエーションは、カーネルを起動して出力を抑制し、quiet
syslogd printk()
/ klogdにのみ依存してカーネルメッセージを処理することです。
より冒険的で包括的なオプションは、以下を使用することです。コンソールモジュールこれは、VMホストがゲストコンソールに直接アクセスできるように、VMゲストと共により一般的に使用されます。持つ2種類、これシステムドライバ(例:x86 PCの「VGA」、カーネル「console =」オプション)。モジュラードライブ必要に応じてロードおよびアンロードすることができ、システムドライバを置き換えることができます。役に立つドライバの1つは次のとおりです。ネットワークコンソール、ロードとアンロードは簡単ですが(システムドライバとモジュラードライバの両方として使用できます)、2つの欠点があります。
- これは事実ではない
take_over_console()
ため、すべてがまだ元のコンソールに移動されます。 - イーサネット経由でのみ録音します(ループバックはサポートされていません)。
「仮想」コンソールと上記のオプションのいずれかを使用して便利な作業を実行できます。netcat
または、socat
Webコンソールに適した「クライアント」を作成します。
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
セッションで実行することもできます。このように。