コマンドを入力した後に呼び出されるシステムコールをどのように追跡できますか?

コマンドを入力した後に呼び出されるシステムコールをどのように追跡できますか?

この質問は以下に関連しています。「シェルに簡単なコマンドを入力するとどうなりますか?」という質問があります。以前に投稿したことがあります。 (別途のローンチが良いと思いますが、そうでない場合は教えてください。)

私はそれから学んだ前の質問シェル組み込みコマンドは特別に処理され、通常の外部コマンドは子プロセスで実行されます。

今回は、fork、clone、execveなどのシステムコールを追跡し、コマンドが入力された後に実際に何が起こるかを監視したいと思います。ただしexecve("bin/ls",,,) = 0、これを実行するとexecve呼び出しのみを追跡できます。strace

strace -etrace=execve,clone ls

推測したように、これは子プロセスが作成された後に呼び出されるシステムコールのみを監視できることを意味します。

新しいプロセスの作成に関連するすべてのシステムコールを監視するにはどうすればよいですか?この場合、bash -c同様のヘルプを使用してコマンドを呼び出しますかstrace -etrace=execve,clone bash -c '{ ls; }'

答え1

のいずれかで述べたように回答前の質問では、execホーム呼び出しは子プロセスが作成された後に発生するため、出力に表示するには、追跡strace中のシェルプロセスの子プロセスも従う必要があります。

-forオプションを追加することで-ffこれを行うことができます。以下は関連マニュアルページの断片です。

 -f  Trace child processes as they are created by currently traced processes as a
     result of the fork(2) system call.
-ff  If the -o filename option is in effect, each processes trace is written to
     filename.pid where pid is the numeric process id of each process.  This is
     incompatible with -c, since no per-process counts are kept.

コマンドの実行に関連する呼び出しを追跡するには、bash次のようにします。

strace -f -e trace=process bash -c 'ls; :'

-e trace=process特に、プロセス管理に関連するすべての呼び出しを追跡します。また、2番目のno-opコマンド()が必要です。たとえば、単一のコマンドでbashを実行している場合は、他の操作を実行する必要がないことがわかっているため、分岐せずに:実行しても十分スマートです。execve

関連情報