6

以下のように a コマンドを実行するアプリケーションがあります。

<command> <switches> >& /dev/null

を構成することはできます<command>が、制御することはできません<switches>。このコマンドによって生成されるすべての出力は に送られ/dev/nullます。出力を画面に表示したり、ログ ファイルにリダイレクトしたりしたい。

freopen()および関連する機能を使用し/dev/nullて別のファイルを再度開いてみましたが、機能しませんでした。

他にアイデアはありますか?これはまったく可能ですか?

御時間ありがとうございます。

PS: 私は Linux で作業しています。

4

12 に答える 12

8

ひどいハック:

バイナリモードでテキストエディタを使用してアプリを開き、「/ dev / null /」を見つけて、同じ長さの文字列に置き換えます

e.g '~/tmp/log'
  • 最初にバックアップを作成します
  • 注意してください
  • 非常に注意してください
  • バックアップについて言及しましたか?
于 2010-03-24T12:34:46.080 に答える
4

実行するコマンドを変更できるため、単純なシェル スクリプトをラッパーとして使用して、出力をファイルにリダイレクトできます。

#!/bin/bash
"$@" >> logfile

これをcapture_output.shとしてパスに保存すると、コマンドの先頭にcapture_output.shを追加して、プログラムの出力をログファイルに追加できます。

于 2010-03-24T13:46:07.370 に答える
3

#コマンドの最後に追加<command> # >& /dev/nullして、不要な部分をコメントアウトします。

于 2010-03-24T12:37:44.453 に答える
2

アプリケーションはおそらくシェルを実行しており、そのコマンド ラインを渡しています。

自分で作成したスクリプトを実行させる必要があります。>/dev/nullそのスクリプトは、コマンド ラインを に置き換え>>/your/log、変更されたコマンド ラインで実際のシェルを呼び出します。

最初のステップは、アプリケーションが使用するシェルを変更することです。環境変数SHELLを変更するだけで十分です。つまり、アプリケーションを次のように実行します。

SHELL=/home/user/bin/myshell theApp

それでもうまくいかない場合は/bin/sh、スクリプトに一時的にリンクしてみてください。

myshell元のシェルを呼び出しますが、パラメーターをパターン置換した後:

#!/bin/bash
sh ${1+"${@/\>\/dev\/null/>>\/your\/log}"}

これらの線に沿った何かが機能するはずです。

于 2010-03-24T13:14:37.947 に答える
1

gdb を使用して、既に実行中のプロセスでこれを行うことができます。次のページを参照してください: http://etbe.coker.com.au/2008/02/27/redirecting-output-from-a-running-process/

于 2010-03-24T12:38:34.667 に答える
1

そのコマンドのエイリアスを作成できますか? その場合は、出力をファイルにダンプする別のコマンドにエイリアスします。

于 2010-03-24T12:45:12.470 に答える
1

編集:これは良い考えではなく、これが何を壊す可能性があるかを知らない限り、試してみる価値はありません。それは私のために働く、あなたのために働くかもしれません.

わかりました、これは本当に悪いハックであり、おそらくやる価値はありません。/dev/null他のコマンドがどれも機能せず、単にバイナリ/アプリケーション ( を含むコマンドを含む) にアクセスできず、出力を他のファイルにリダイレクトできない ( を置き換えることによって)と仮定します/dev/null

次に、/dev/null ( $> rm /dev/null) を削除し、すべてのデータを転送できる場所 (できればソフト リンクを使用) に独自のファイルを作成します。完了したら、次のコマンドを使用して /dev/null をもう一度作成できます。

$> mknod -m 666 /dev/null c 1 3

はっきりさせておくと、これは悪いハックであり、動作するにはルート権限が必要です。/dev/nullリダイレクトされたファイルには、実行されてシンクとして使用されている他の多くのアプリケーション/バイナリからのデータが含まれている可能性が高くなります。

于 2010-03-24T12:46:04.700 に答える
1

デバイス ファイル/dev/ttyは、アプリケーションの制御端末を参照します。それが変更されていない場合、これは機能するはずです。

freopen("/dev/tty", "w", stdout);
freopen("/dev/tty", "w", stderr);

または、それらを再度開いてログ ファイルを指すようにすることもできます。

freopen("/var/log/myapp.log", "a", stdout);
freopen("/var/log/myapp.err", "a", stderr);
于 2010-03-24T12:50:05.413 に答える
1

正確にリダイレクトするわけではありませんが、送信されている場所に出力を取得できます

strace -ewrite -p $PID

それはそれほどきれいではありません(次のような行を示します: write(#,) )が、機能します!(そして単一行です:D)引数が省略されているという事実も嫌いかもしれません。それを制御するには、表示される文字列の最大長を設定する -s パラメータを使用します。

すべてのストリームをキャッチするので、何らかの形でフィルタリングしたい場合があります。

あなたはそれをフィルタリングすることができます:

strace -ewrite -p $PID 2>&1 | grep "write(1"

記述子 1 の呼び出しのみを示します。2>&1 は、strace がデフォルトで stderr に書き込むため、stderr を stdout にリダイレクトします。

于 2010-04-27T21:23:23.037 に答える
0

e-t172 の回答に沿って、最後のスイッチを次のように設定 (または追加) できますか?

; echo 
于 2010-03-24T14:28:37.007 に答える
0

STDOUTperl では、もう少し便利なものにリダイレクトしたい場合は、次のようにするだけです。

open STDOUT, '>>', '/var/log/myscript.log';
open STDERR, '>>', '/var/log/myscript.err';

スクリプトの先頭に追加すると、スクリプトの残りの部分でリダイレクトされます。

于 2010-03-24T14:10:54.380 に答える
0

/dev/null に何かを渡す前に何かをインライン化できる場合 (ハードコードされたコマンドを扱っているかどうかは不明)、teeを使用して選択したものにリダイレクトできます。

コマンドのエスカレーションを許可するウィキペディアの例:

echo "Body of file..." | sudo tee root_owned_file > /dev/null

http://en.wikipedia.org/wiki/Tee_(コマンド)

于 2010-05-16T03:24:23.717 に答える