void system(string program, ...)
system() アクションは、program で指定されたプログラムを、シェルで実行したときのようにして実行します。program 文字列には、printf() または printa() の書式変換を含めることができます。その書式変換に合った引数を指定する必要があります。有効な書式変換の詳細については、第 12 章出力書式を参照してください。
以下は、毎秒 1 回 date(1) コマンドを実行する例です。
# dtrace -wqn tick-1sec'{system("date")}' Tue Jul 20 11:56:26 CDT 2004 Tue Jul 20 11:56:27 CDT 2004 Tue Jul 20 11:56:28 CDT 2004 Tue Jul 20 11:56:29 CDT 2004 Tue Jul 20 11:56:30 CDT 2004 |
以下は、先ほどの例よりもアクションの使い方が複雑になった例です。この例では、program 文字列内で、printf() 変換と、パイプのような従来のフィルタリングツールが使用されています。
#pragma D option destructive #pragma D option quiet proc:::signal-send /args[2] == SIGINT/ { printf("SIGINT sent to %s by ", args[1]->pr_fname); system("getent passwd %d | cut -d: -f5", uid); }
このスクリプトを実行すると、次のような出力が得られます。
# ./whosend.d SIGINT sent to MozillaFirebird- by Bryan Cantrill SIGINT sent to run-mozilla.sh by Bryan Cantrill ^C SIGINT sent to dtrace by Bryan Cantrill |
指定されたコマンドは、起動するプローブのコンテキストでは実行されません。実行されるのは、system() アクションの詳細情報が格納されているバッファーがユーザーレベルで処理されたときです。この処理がどのようにしていつ行われるのかは、バッファリングポリシーによって異なります。詳細については、第 11 章バッファーとバッファリングを参照してください。デフォルトのバッファリングポリシーでは、バッファー処理間隔は switchrate オプションで指定されます。次の例のように、明示的に switchrate をチューニングして、デフォルト値の 1 秒よりも長くした場合、system() 内で遅延が発生します。
#pragma D option quiet #pragma D option destructive #pragma D option switchrate=5sec tick-1sec /n++ < 5/ { printf("walltime : %Y\n", walltimestamp); printf("date : "); system("date"); printf("\n"); } tick-1sec /n == 5/ { exit(0); }
このスクリプトを実行すると、次のような出力が得られます。
# dtrace -s ./time.d walltime : 2004 Jul 20 13:26:30 date : Tue Jul 20 13:26:35 CDT 2004 walltime : 2004 Jul 20 13:26:31 date : Tue Jul 20 13:26:35 CDT 2004 walltime : 2004 Jul 20 13:26:32 date : Tue Jul 20 13:26:35 CDT 2004 walltime : 2004 Jul 20 13:26:33 date : Tue Jul 20 13:26:35 CDT 2004 walltime : 2004 Jul 20 13:26:34 date : Tue Jul 20 13:26:35 CDT 2004 |
walltime の値は異なっているが、date の値は一致している点に注目してください。これは、date(1) コマンドが、system() アクションが記録されたときではなく、バッファーが処理されたときにだけ実行されるからです。