bashで実行されているすべてのプロセスを追跡する方法はありますか?

bashで実行されているすべてのプロセスを追跡する方法はありますか?

私はbashを介して私が最も実行しているプログラムを数えることを望みます。 bashにある種のフックを挿入してbashが実行するすべての操作を記録する方法はありますか?

単にbash履歴ファイルを見るだけでは不十分です。履歴の各行で最初のトークンを印刷できますが、パイプとプロセスの交換は行われません。私は以下が欲しい:

$ ls /usr/bin/* | fgrep $(echo grep)

ls、、、fgrepおよび実行をそれぞれ1回記録しますecho。そして次:

$ for file in /usr/bin/*; do stat $file; echo $file; done

注意を払って走らなければstatなりませんecho。 Bash フロー制御ステートメントなのでfor記録されません。

シェルの組み込み機能と関数を記録する必要があるかどうかは議論の余地があります(おそらくその内容のみ)。上記の例では、1つ以上のランループを記録する必要があるかどうかも議論のstat余地echoがあります。ただし、最も簡単な方法で出力を処理できます。

Bashを実行すると、プロセスに接続して進行状況を記録する-x内部メカニズムがあることがわかります。exec入る他の方法はありませんか?

答え1

まず、

strace -e execve -b execve -f -qqv -e signal='!all' bash 

スモークテストを使用していない場合は、stderrをいくつかのロガーパイプにリダイレクトするか、straceのファイルを使用していくつかの乱れディレクトリを破棄する必要があります-o-o ~/commandtraces/$(date +%Y%m%d%H%M%S).$$

すべての対話型シェルに対してこれを行うには、再帰を防ぐためにガード変数が必要だと思います.bashrc

答え2

ローカルシステムで非常に注意を払っている場合は、すべての/ usr / binファイルをラッパーに置き換えることができます。
それはまるで

cp -pr /usr/bin /usr/orgbin
cd /usr/bin
for f in *; do
   echo "/usr/orgbin/echo $f used >> /tmp/bin_usage.out" > $f
   chmod +x $f
done

まず、無害なプログラム2つを試してみましょうか?

答え3

PROMPT_COMMANDフックを使用して、最後に入力したコマンドを記録する内容を挿入できます。このログはコマンドを使用して生成できますlogger

それはまるでexport PROMPT_COMMAND="logger `history 1`"

関連情報