機械翻訳について

DTraceスクリプトの作成

DTraceスクリプトを作成して、Dプログラミング言語の理解を深める方法を学習します。

DTraceがシステムにインストールされていて、プローブのリスト表示と有効化ができることを確認します。 DTraceのインストール」と「プローブのリストと有効化」を参照してください。

このチュートリアルでは、システムについての有用な情報を収集するために使用できるDTraceスクリプトを開発する一連のステップを示します。 このチュートリアルは、今後、DTrace用の別のスクリプトを作成するためのフレームワークとして使用できます。

  1. テキスト・エディタで、hello.dという名前のファイルを作成し、dtrace:::BEGINプローブに対して起動するDTrace句を記述します。

    エディタに次のテキストを入力します:

    dtrace:::BEGIN
    {
      trace("hello, world");
      exit(0);
    }

    ファイルを保存します。

  2. dtrace -sコマンドを使用して、hello.dプログラムを実行します。
    sudo dtrace -s hello.d

    次のような出力が表示されます。

    dtrace: script 'hello.d' matched 1 probe
    CPU     ID                    FUNCTION:NAME
      0      1                           :BEGIN   hello, world    

    プログラムでBEGINプローブにexit関数を指定したため、終了するためにCtrl + Cを押す必要はありませんでした。

  3. テキスト・エディタでhello.dを開いて、スクリプトの先頭にインタプリタ行を追加します。

    ファイルを編集し、ファイルの先頭に次のテキスト行を追加します。

    #!/usr/sbin/dtrace -s
    完全なスクリプトは次のとおりです:
    #!/usr/sbin/dtrace -s
    dtrace:::BEGIN
    {
      trace("hello, world");
      exit(0);
    }

    ファイルを保存します。

  4. hello.dファイルの権限を変更して、実行可能にします。

    chmodコマンドを実行して、ファイルのアクセス権を更新します:

    chmod a+rx hello.d
  5. 新しい実行可能スクリプト・ファイルを実行します。

    sudoコマンドを使用して、DTraceスクリプトがroot権限のまま実行されるようにして、すべてのDTrace機能にアクセスできるようにします。

    sudo ./hello.d

    プログラムの先頭にインタプリタ行を含めると、dtraceコマンドの指定なしでもスクリプトを実行できます。

  6. 外部マクロ変数を使用するように、スクリプトを変更します。

    スクリプトの引数として名前を指定したときに、名前で人に挨拶するようにファイルを編集します。

    #!/usr/sbin/dtrace -s
    dtrace:::BEGIN
    {
      printf("hello, %s", $$1);
      exit(0);
    }

    trace関数がprintf()関数に置き換えられて、変数置換を使用して文字列にマクロ変数$1を挿入できるようになりました。 $$構文は、文字列値として表すマクロ変数を参照するときに使用します。

  7. このスクリプトを実行して、変更による動作の変化を確認します。

    次のコマンドを使用して、前述のようにスクリプトを実行します:

    sudo ./hello.d

    次のようなエラーが生成されます:

    dtrace: failed to compile script ./hello.d: line 4: macro argument $$1 is not defined
    このスクリプトの実行時には、引数も指定する必要があるため、エラーが生成されます。 スクリプトを再度実行してみますが、今回は名前を指定します:
    sudo ./hello.d bob

    このスクリプトは次のような出力を返します:

    dtrace: script './hello.d' matched 1 probe
    CPU     ID                    FUNCTION:NAME
      3      1                           :BEGIN hello, bob
  8. プラグマ文を使用するように、スクリプトを変更します。

    スクリプトの冗長性を減らして、出力を節が機能的に返す内容のみに制限するために、実行時のquietオプションを設定するプラグマ文を追加します。 次のようにスクリプトを編集して、プラグマ文を追加します:

    #!/usr/sbin/dtrace -s
     #pragma D option quiet
     dtrace:::BEGIN
     {
       printf("hello, %s", $$1);
       exit(0);
     }
  9. このスクリプトを実行して、変更による動作の変化を確認します。

    次のコマンドを使用して、前述のようにスクリプトを実行します:

    sudo ./hello.d sally

    スクリプトの出力は、printf()関数によって返されるもののみに削減されます。

  10. この節を処理するタイミングを制御するための述語を使用するように、スクリプトを変更します。

    述語を使用することで、特定の条件がtrueの場合にのみ実行されるようにスクリプトを制御できます。 スクリプトを編集して述語行を追加し、次のようにマクロ変数の文字列値が'bob'と等しいかどうかを評価します:

    #!/usr/sbin/dtrace -s
     #pragma D option quiet
    
     dtrace:::BEGIN
     /$$1=="bob"/
     {
       printf("hello, %s", $$1);
       exit(0);
     }
  11. このスクリプトを実行して、変更による動作の変化を確認します。

    次のコマンドを使用して、前述のようにスクリプトを実行します:

    sudo ./hello.d sally

    スクリプトは終了せず、Ctrl + Cを押してプロセスを強制終了する必要があります。 これは、exit()関数が、スクリプトの最初の引数が'bob'と等しいかどうかを評価する句の一部であるためです。 引数としてbobを使用して、スクリプトを再度実行してみます。

    sudo ./hello.d bob

    スクリプトは以前と同様に実行され、述語が機能していることを実証しています。