私が実行すると仮定すると、time ./a.out
変数を介してPIDを取得できます。ところで、PIDはどのように取得しますか?time
$!
a.out
もちろん、出力を解析することはできますが、ps
よりエレガントなソリューションが必要です。
確認しましたが、man time
何も見つかりませんでした。
私が得た最も近いものでしたが、time (sleep 10 & echo $!)
四半期のために費やされた時間は基本的に10秒ではなくゼロでした。
答え1
定義によると、a.out
これは子プロセスですtime
。time
親プロセスの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
答え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