2016-04-27 1 views
-1

実行中のすべてのプロセスの出力を変更してリダイレクトする必要があります。私は、私は、プロセスの名前を知っていれば、私はDEV/nullに標準エラー出力とstdoutをリダイレクトします。このUnix:実行中のすべてのプロセスのstdoutを変更してリダイレクトする方法

process 2>&1 >/dev/null 

ような何かを行うことができることを知っています。まず、dev/nullや他の場所に送る前に、stdoutをどのように変更するのですか?可能な解決策の1つは

process 2>&1 | awk '{print "$SOME_ENV_VAR|" $0;}' > dev/null 

です。これは正しい方法ですか? stdoutとstderrの両方がリダイレクトされることは耐えられますか?

  1. dev/nullにリダイレクトするのではなく、コンソールに出力したいのですが?

  2. 大きな問題は、実行中のプロセスごとにこれを行う方法です。私は実行しているプロセスの名前を知らないLinuxのボックスでこれを行う必要があります。それは実現可能ですか?

私はシェルスクリプトの新機能ですので、これらの質問は簡単です。

+0

まず、使用しているシェルの種類を述べる必要があります。 Linuxでは、bashを使用している可能性は非常に高いです。それから、_running processes_は、プロセスを開始してからI/O割り当てを変更しようとしていることを示唆しています - これは(少なくともカーネルを特別にサポートしなくては)不可能です。しかし、あなたの例では、プロセスの開始時にI/Oを明確にすることをお勧めします。最後に、達成したいと思うものについてもっと細かく説明しなければなりません。 sh(したがってbashも)は、プロセスのstin/stdout/stderrが互いにどのように接続できるかという点で非常に強力です。 – rpy

+0

ありがとう、ちょうどそのawk '{print "$ SOME_ENV_VAR |" $ 0;} ''はenv変数をcathcしません。どのようにawkで環境変数を使用できますか? – AbtPst

+1

これは 'awk'のプロパティではなく、' awk'スクリプトパラメータで一重引用符( '' ')を使用した結果です。例えば、 'awk '{print'" $ SOME_ENV_VAR | "'$ 0;}''を使用しました。しかし、これは単に '$ SOME_ENV_VAR'の値を' process'の各行の前に置いて、 '/ dev/null'を送るだけです。 – rpy

答えて

1

すでに実行中のプロセスの出力を別の場所にリダイレクトすることを実際には意図していないことが議論から明らかになりました。しかし、開始しているプロセスの出力を変更しようとしているようです。

bash(使用していると思われる)を使用すると、[FD]>TARGET resp。 [FD]<SOURCEを使用して、プロセスのI/Oチャネルを指定します。 FDはオプションで、ファイル記述子番号です。それを出すことは、<1(= stdout)の0(= stdin)が>にあることを意味します。 (2はstderrのよく知られたファイル記述子です)。 TARGETまたはSOURCE私はファイルシステムオブジェクト(ファイル、デバイス、名前付きパイプ、unixドメインソケット)または&FDです。ここで、FDは再びファイル記述子番号であり、使用する(オープン)ファイル記述子を示します。

たとえば、2>&1に書き込むことによって、stdoutがどこに行くのかにエラー出力が送られるようにします。

あなたが今のプロセスからの出力を後処理する場合(それはいくつかのコマンドおよびI/Oリダイレクションそれ自体からなる任意の複合体(シェル)文である可能性があるので、実際にこれはシェル用語ではパイプラインである。)あなたが使用する パイプ:(A | B)。
これは基本的にプロセスAのstdoutをプロセスBのstdinに接続します。

他のunixコマンドまたはプログラムを使用することができます。最も一般的なのはsed(正規表現ベースの置換を適用する場合)またはawkです。他にもperlまたはpythonをお勧めします。

あなたの場合、環境変数で与えられた接頭辞を各行の先頭に追加します。

awk '{ print "'"$SOME_ENV_VAR"'|" $0;}' 

やawkの変数などの外部値を渡す:少しさらにこれを取るために

awk -v var="$SOME_ENV_VAR" '{ print var "|" $0;}' 

次のようにあなたはそれを書くことができawkを使用して

bashによる出力リダイレクションは非常に強力です。たとえば、stdoutを1つのパイプに、sterrを別のパイプに渡すことができます。例えば:

(((echo hallo; echo ERROR >&2) | awk '{ print "stdout|" $0; }' >&4) 2>&1| awk '{ print "stderr: " $0;}') 4>&1 

これは、別個のAWKインスタンスによってstdoutとsterrを処理し、シェルの通常の標準出力に(組み合わせ)出力を送ります。

+0

を受け入れるよ!ありがとう。ここで4はどういう意味ですか? 1はstdout、2はstderr、3はデバッグだと思います。それは正しい? – AbtPst

+1

filedescriptorは整数(> = 0)です。実際には、これはプロセス固有のオープンファイルテーブルへのインデックスです。最大値はシステムに依存します。 ulimit -nを使用して、現在のシステムの現在の最大値を取得します。私はここで慎重に "4"を選んだ。唯一の要件は、すでに開いている標準記述子の値(0,1,2)とは異なります。 '4>&1'はこの記述子を開きます。 '>&4'はそれを使用しています。 (schellはこれらを 'dup'システムで呼び出しています。)0,1,2はシェルによって管理されており、「よく知られている」何か他のものはプログラムやユーザに依存しています。 – rpy

関連する問題