Bash シェル スクリプトの起動が遅い場合、プロファイルを作成するにはどうすればよいでしょうか? 質問する

Bash シェル スクリプトの起動が遅い場合、プロファイルを作成するにはどうすればよいでしょうか? 質問する

私の Bash シェルは起動に 3 ~ 4 秒かかりますが、 で起動すると--norcすぐに実行されます。

私は「プロファイリング」を開始し/etc/bash.bashrc~/.bashrc手動でreturnステートメントを挿入して速度の向上を模索しましたが、これは定量的なプロセスではなく、効率的ではありません。

Bash スクリプトをプロファイルし、実行に最も時間がかかるコマンドを確認するにはどうすればよいでしょうか?

ベストアンサー1

GNU (またはナノ秒を出力できる別のバージョン) をお持ちの場合はdate、Bash スクリプトの先頭/etc/bash.bashrc(またはトレースを開始したい場所) でこれを実行してください。

PS4='+ $(date "+%s.%N")\011 '
exec 3>&2 2>/tmp/bashstart.$$.log
set -x

追加

set +x
exec 2>&3 3>&-

の末尾~/.bashrc(またはトレースを停止したい Bash スクリプトのセクションの末尾)に\0118 進数のタブ文字を入力します。

実行された各コマンドの秒.ナノ秒のタイムスタンプを示すトレース ログが取得されます/tmp/bashstart.PID.log。ある時点から次の時点までの差は、介在するステップにかかった時間です。

対象を絞り込むにつれて、set -x後またはset +x前に移動できます (または、関心のあるいくつかのセクションを選択的に囲むことができます)。

GNU のナノ秒ほどきめ細かくはありませんがdate、Bash 5 にはマイクロ秒単位で時間を表す変数が含まれています。これを使用すると、行ごとに外部実行ファイルを生成する必要がなくなり、Mac や GNU のない他の環境でも動作しますdate(もちろん、Bash 5 があれば)。 の設定を変更してくださいPS4:

PS4='+ $EPOCHREALTIME\011 '

BASH_XTRACEFD@pawamoyが指摘したように、 Bash 4.1以降を使用している場合は、トレースの出力を別のファイル記述子に送信するために使用できます。この答え:

#!/bin/bash

exec 5> command.txt
BASH_XTRACEFD="5"

echo -n "hello "

set -x
echo -n world
set +x

echo "!"

これにより、トレース出力はファイルに残されcommand.txtstdout通常stdoutどおり出力されます (または個別にリダイレクトされます)。

結果を理解する

OpenOffice / Libre calc を使用すると、各コマンドにかかった時間と実行中の合計を確認できるため、以下の例では lesspipe に 6 ミリ秒かかっていることが簡単にわかります。

色分けされた計算スプレッドシート

  1. 結果のログ ファイルをコピーして新しいスプレッドシートに貼り付けます。
  2. 次のタイムスタンプとの差分のタイムスタンプの後に新しい列を挿入します。列 C を挿入した場合は、=B2-B1セル C1 に挿入し、そのセルを C 列全体にコピーして貼り付けます。
  3. 絶対タイムスタンプの代わりに、最初のタイムスタンプをコピーし、タイムスタンプ列を選択してCtrl+Shift+Vを押すことで、0から始めることができます。特殊貼り付け > 減算
  4. あなたはできるXより大きい色の値長い個々のコマンドを強調表示するには赤にします。

おすすめ記事