0

非対話型シェルで実行されたプロセスのリストをキャプチャする方法があるかどうか疑問に思っていますか?

基本的に、他のソースからいくつかの変数を呼び出すスクリプトがあり、その変数の値を確認したいと考えています。ただし、スクリプトの実行と終了は非常に高速であるため、ps を使用して値を取得することはできません。

プロセスと使用された引数をログに記録する方法はありますか?

ティア・ハスキー

編集:

この例では、Solaris を使用しています。渡された値をキャプチャするためのクイック ループ スクリプトを作成することも考えましたが、これはあまり正確ではないようで、実行が常にキャプチャされるとは限りません。私はこれを試しました:

   #!/bin/ksh

   while [ true ]
   do

   ps -ef | grep  $SCRIPT_NAME |egrep -v 'shl|lis|grep' >> grep_out.txt

   done

私はスリープを使用しますが、すべてのスリープ実行可能ファイルが小数値ではなく整数値を必要とするため、精度を指定できません。

4

3 に答える 3

3

Solaris の場合:

truss -s!all -daDf -t exec yourCommand 2>&1 | grep -v ENOENT

AIX およびその他の System V ベースの OS の場合:

truss -s!all -daDf -t execve yourCommand 2>&1 | grep -v ENOENT

Linux および strace をサポートするその他の OS では、次のコマンドを使用できます。

strace -ff -etrace=execve yourCommand 2>&1 >/dev/tty | grep -v ENOENT

トレースするコマンドが既に実行されている場合は、トレースするプロセスのプロセス ID である pid に置き換えることyourCommand-p pidできます。

編集:

Solaris で実行中のスクリプトをトレースする方法は次のとおりです。

for pid in $(pgrep -f $SCRIPT_NAME); do
    truss -s!all -daDf -t exec -p $pid 2>&1 | grep -v ENOENT > log.$pid.out &
done

Solaris では、 を使用dtraceして同じもの (およびそれ以上) を取得することもできることに注意してください。

于 2014-10-01T16:52:37.037 に答える
3

ほとんどのシェルはデバッグ モードで呼び出すことができます。このモードでは、実行中の各ステートメントが、変数の置換と展開のに stdout (または stderr)に出力されます。

Bourne のようなシェル ( shbash) の場合、デバッグは-xオプション ( のようにbash -x myscript) を使用するかset -x、スクリプト自体内のステートメントを使用して有効にします。

ただし、デバッグは「現在の」スクリプトに対してのみ機能します。スクリプトが他のスクリプトを呼び出す場合、これらの他のスクリプトはデバッグ モードで実行されません。さらに、関数内のコードはデバッグモードでも実行されない場合があります-特定のシェルに依存します-ただしset -x、関数内で使用してデバッグを明示的に有効にすることはできます。

于 2014-10-01T14:58:28.307 に答える