特定の実行可能ファイルの入出力を傍受する

特定の実行可能ファイルの入出力を傍受する

いくつかの計算を実行するために、より大きなアプリケーションで呼び出される特定のLinux実行可能ファイルがあります。まず、実行可能ファイルの呼び出し方法と、パラメータとデータの転送方法を理解する必要があるため、計算の実行方法を変更したいと思います。

したがって、この実行可能ファイルが呼び出されたら、コマンドライン引数stdinとstdoutを監視したいと思います。実行可能ファイルの正常な動作を妨げてはいけません。

これを行う簡単な方法はありますか?

修正する:

次のスクリプトを使用してすべてのデータを取得するために、シェルスクリプトのプレースホルダのアイデアを試しました。

#!/bin/bash
export LOGFILE=/tmp/logname
echo `env` > $LOGFILE-env
echo "$@" >> $LOGFILE-arguments
tee -a $LOGFILE-stdin | /path/to/real/executable 2>&1 | tee -a $LOGFILE-stdout

これはテスト入力にはうまく機能しますが、実際に呼び出されると中断されます。たぶん私が思ったよりも多くのことが起こっているかもしれません。

答え1

オプション1は、呼び出し元アプリケーションのソースコードを変更してそれをtee出力パイプラインに挿入して、そのステップで確認する出力コピーを取得することです。

オプション2は、関連する実行可能ファイルの周りにラッパースクリプトを作成することです。標準入力と引数を実際のアプリケーションに渡してから、アプリケーションがほんの数行のコードで始めることができるように、ユーザーが見て吐き出すことができる出力をどこかに送信するクイックスクリプトです。特別な場所に配置し、その場所をPATH変数の前に追加してからアプリケーションを実行します。

#!/bin/sh
cat - | /path/to/realapp $@ | tee /tmp/debug_output

答え2

電話でプログラムに関する多くの情報を得ることができます。strace。これは、プログラムが実行したすべてのシステムコールを示しています。時にはあまりにも有益かもしれませんが、問題のある場所を見つけるのに非常に役立ちます。

方法1はにありますstrace。これにより、出力が増え、アプリケーションが遅くなる可能性があります。

strace -s9999 -efile,process -f -o bigapp.strace bigapp

大規模なアプリケーションがインタラクティブである場合は、それを起動し、計算を実行する準備ができたらstraceをリンクすることをお勧めします。アプリケーションのプロセスID(例:12345)を記録したら、次のようにします。

strace -s9999 -efile,process -f -o bigapp-calculations.strace -p12345

外部実行ファイルを観察するだけで十分であれば その他 回答実行可能ファイルをラッパースクリプトに置き換える必要があるという提案がありました。実行可能ファイルを別の名前に移動し、その場所にラッパースクリプトを置く、通常の実行可能ファイルの前にラッパースクリプトを置く、またはPATH便利な場合は、一般的に使用される実行可能ファイルの代わりにラッパースクリプトを呼び出すようにアプリケーションを構成できます。ラッパースクリプトの作成

#!/bin/sh
exec strace -s9999 -efile -o auxapp-$$.strace /path/to/original/executable "$@"

使用されるトレースパラメータの説明:

  • -e選ぶシステムコール道。名前でシステムコールを指定したり、(、、、、fileopen)や(、、 …)などのいくつかのカテゴリを使用できます。closereadwriteprocessforkexecve
  • -fstraceが続くようにしてくださいフォークつまり、元のプロセスだけでなく子プロセスも追跡します。
  • -oトレースを含むファイルの名前を選択します。$$シェルプロセスのプロセスIDを表すシェル構成(exec最後のラッパースクリプトで使用されたため、ヘルパーアプリケーションのプロセスIDでもあります)。
  • -s9999sumおよび他の呼び出しのバイトを表示するようにしますreadwrite

答え3

パスを変更しないでください。興味のあるバイナリを「binary」から「binary.orig」に移動してスクリプトに置き換えます。あなたはこれらのパラメータに興味があり、それをファイルに書きたいと言いました。 「env」コマンドの出力に興味があるかもしれません。現在アクティブなすべての環境変数をダンプします。あるプログラムはしばしば、環境変数を使用して自分が呼び出す他のプログラムの動作に影響します。

答え4

以下は私にとって効果的でした。

cat-|tee/tmp/in.log | /path/to/realapp$@ |tee/tmp/out.log

関連情報