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}')