関数内で関数を呼び出すプロセスのIDを取得します。

関数内で関数を呼び出すプロセスのIDを取得します。

Kornシェルスクリプトで特定の機能を呼び出すプロセスのIDを記録したいと思います。

たとえば、カスタム自動ロード関数SQUAREを考えてみましょう。これで、TestSquare.shスクリプトがSQUARE関数を呼び出す場合。実行中のTestSquare.shのプロセスIDとTestSquare.shプロセスの開始時刻をキャプチャしたいと思います。

関数にパラメータを渡したくありません。呼び出しスクリプトのプロセスIDのみを使用してすべての情報を構成したいと思います。

ベストアンサー1

シェルのプロセスIDは特殊パラメータで使用できます$$(kshマニュアルの「パラメータ拡張」セクションで説明されています)。

log () {
  printf "script=%s pid=%d message=%s\n" "$0" "$$" "$1"
}

これは$$スクリプトのプロセスIDです。サブシェル(つまり、括弧内、コマンド置換内、パイプ左など)でコードを実行しても、値は変更されません$$。実際にログメッセージを発行したプロセスIDが必要な場合は、子プロセスを呼び出して親プロセスIDを報告するように指定することで取得できます。 (一部のシェルには変数がありますが、ATT kshではないようです。)

log () {
  printf "script=%s script_pid=%d emitting_pid=%d message=%s\n" \
         "$0" "$$" "$(sh -c 'echo $PPID')" "$1"
}

スクリプトの開始時刻を記録する場合、最も簡単な方法は、スクリプトの開始時に現在の時刻を変数に割り当てることです。

#!/bin/ksh
start_time=$(date)

後でスクリプトの開始時刻を取得する必要がある場合は、getを使用できますが、ps -o stime日付と時刻全体は提供されません。あるいは、SECONDS変数(常にスクリプトが開始されてからの秒数を含む)と現在の日付に基づいて計算することもできます。 kshを使用している場合は、GNU日付がない可能性があるため、便利な日付計算ツールはありません。 awk は以下から得ることができるバイパス方法を提供します。連帯したがって、次のコードスニペットは、start_timeエポック以降のスクリプトの開始時間を秒単位で設定します。

start_time=$(export SECONDS; awk 'BEGIN {srand(); print srand() - ENVIRON["SECONDS"]; exit}')

おすすめ記事