時間ごとにプロセス開始のPIDを取得します。

時間ごとにプロセス開始のPIDを取得します。

私が実行すると仮定すると、time ./a.out変数を介してPIDを取得できます。ところで、PIDはどのように取得しますか?time$!a.out

もちろん、出力を解析することはできますが、psよりエレガントなソリューションが必要です。

確認しましたが、man time何も見つかりませんでした。

私が得た最も近いものでしたが、time (sleep 10 & echo $!)四半期のために費やされた時間は基本的に10秒ではなくゼロでした。

答え1

定義によると、a.outこれは子プロセスですtimetime親プロセスのpidも同様ですa.out!以下は私がa.out置き換えるテストですsleep 60

$ time sleep 50 & timepid=$!
$ aoutpid=$(pgrep -P $timepid)
$ ps -o ppid,pid,start,cmd w -p $$,$timepid,$aoutpid

PPID   PID  STARTED CMD
2065  2068 21:34:57 -bash
2068  3297 22:16:05 -bash
3297  3298 22:16:05 sleep 50

(注:はtime実際にシェル組み込みコマンドなので、上記のコマンドはbash!)

答え2

コマンドを実行するのに必要な時間と比較してシェルを起動する時間が無視できる場合は、中間シェルを実行して組み込みコマンドを使用して、シェルが子プロセスとして実行されずに置き換えられることをexec確認できます。a.out

time sh -c 'echo $$; exec ./a.out'

答え3

pgrepPIDを探す:

pgrep -l "a.out"

読むmap pgrepより多くのアイデアを得るために。

答え4

小さなシェルフラグメントを作成して、残りのコマンドラインを子プロセスとして実行し、子プロセスのPIDを副作用としてキャプチャできます。

以下はこれを実行するスクリプトです(簡潔にするためにエラーチェックは省略されています)。

#!/bin/sh
#
"$@" &
CHILD=$!
echo "$CHILD" >/tmp/mychild.pid
echo "INFO: child is $CHILD" >&2
wait

名前を指定するには、whatsmychildシーンで次のように使用します。

time whatsmychild a.out

それが効果があるという証拠はありますか?ここに別のスクリプトがありますwhatsmypid

#!/bin/sh
#
echo "My PID is $$" >&2
exit 0

今実行します:

$ time identifymychild whatsmypid
INFO: child is 8105
My PID is 8105

real    0m0.006s
user    0m0.000s
sys     0m0.000s
$ cat /tmp/mychild.pid
8105

関連情報