1. ホーム
  2. bash

[解決済み] Bashシェルスクリプトの起動を遅くするプロファイルはどうすればいいですか?

2022-05-18 02:04:02

質問

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

"プロファイリング"を開始しました。 /etc/bash.bashrc~/.bashrc を手動で挿入することで return ステートメントを手作業で挿入し、スピードの向上を求めていますが、定量的な処理ではないため、効率的ではありません。

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

どのように解決するのですか?

もし、あなたがGNU date (あるいはナノ秒を出力できる他のバージョン) を使っている場合、これを /etc/bash.bashrc (または任意の Bash スクリプトでトレースを開始したい場所) でこれを行います。

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

加える

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

の末尾にある ~/.bashrc (の最後(またはトレースを停止させたいBashスクリプトのセクションの最後)。このとき \011 は8進数のタブ文字です。

でトレースログを取得する必要があります。 /tmp/bashstart.PID.log に、実行された各コマンドの seconds.nanoseconds タイムスタンプを示すトレース ログが表示されるはずです。ある時間から次の時間への差は、その間にかかった時間の量です。

物事を絞り込んでいくと set -x を後に、そして set +x より前に(または選択的に興味のあるいくつかのセクションをブラケット)。

は、GNUの date のナノ秒ほど細かいものではありませんが、Bash 5 にはマイクロ秒単位で時間を表す変数があります。これを使うと、すべての行に対して外部実行ファイルを生成する手間が省けますし、Mac や GNU date - がないMacなどでも動作します。もちろんBash 5があればですが。の設定を変更します。 PS4 :

PS4='+ $EPOCHREALTIME\011 '

pawamoy さんのご指摘の通り、このように BASH_XTRACEFD を使うと、Bash 4.1 以降であれば、トレースの出力を別のファイル記述子に送ることができます。から この答え :

#!/bin/bash

exec 5> command.txt
BASH_XTRACEFD="5"

echo -n "hello "

set -x
echo -n world
set +x

echo "!"

これにより、トレース出力はファイル command.txt を残して stdoutstdout が正常に出力されるように(あるいは別々にリダイレクトされるように)します。