[解決済み] Bashシェルスクリプトの起動を遅くするプロファイルはどうすればいいですか?
質問
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
を残して
stdout
と
stdout
が正常に出力されるように(あるいは別々にリダイレクトされるように)します。
関連
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで通常のファイルが存在しないかどうかを判断する方法を教えてください。
-
[解決済み] Bashで文字列変数を連結する方法
-
[解決済み] Bashで文字列が部分文字列を含むかどうかをチェックする方法
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで文字列をデリミターで分割するには?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトの入力引数の存在確認
-
[解決済み] Pythonスクリプトのプロファイリングはどのように行うのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】firebase-tools "-bash: firebase: command not found".
-
[解決済み] Bashで$()と`の違いはあるのでしょうか?重複] [重複
-
[解決済み] curl: 引数リストが長すぎる
-
[解決済み] Bashスクリプトで引数を反復処理する方法
-
[解決済み] cshスクリプトをbashでソースして環境を設定する方法 [終了しました]。
-
[解決済み] あいまいなリダイレクト」エラーが発生する
-
[解決済み] 絶対パスと論理パスの違い
-
[解決済み] bash スクリプトを実行している docker エントリポイントに "permission denied" が表示される。
-
[解決済み] 時間(ミリ秒)を取得するコマンド
-
[解決済み] Bashスクリプトをデバッグするにはどうしたらいいですか?[クローズド]