表題の方法の裏づけを確認したいため、質問させてください。
たとえば、10MBのデータをバックグラウンドで作成する場合など、バックグラウンドの処理時間を測定したいのですが、timeコマンドでは正しく取得できているかどうかに疑問があります。
実行結果は以下のとおりです。
# time dd if=/dev/zero of=./data bs=1024 count=10240 &
1024+0 records out
real 0m 0.28s
user 0m 0.00s
sys 0m 0.26s
<ここでreturnを押下すると以下のメッセージが表示される>
[1] + Done time dd if=/dev/zero of=./data bs=1024 count=10240 [※]
&を指定しない場合の処理時間と差はほとんどありませんので、正しく動作していると思いますが、[※]印のメッセージが(中断を示唆しているようで)気になっております。
質問は、次の3点です。
①timeコマンドはバックグラウンド処理時間を測定できますか?
②そうでない場合、代替方法がございましたらご教授をお願いいたします。
③[※]印は何を意味していますか?
よろしくお願いいたします。
きちんと、測定できてますよ。
./data のサイズが、期待通りのサイズになっていることでも、処理が完了していることが分かると思います。
[1] + Done time dd if=/dev/zero of=./data bs=1024 count=10240
このメッセージは、処理の中断ではなく、処理の完了をフォアグラウンドジョブに伝えるメッセージです。
time コマンドでの測定ではなく、dd コマンドをバックグラウンドジョブで動かしても、同様のメッセージが通知されます。
% dd if=/dev/zero of=./data bs=1024 count=10240 &
ただ、どんな場合でも正しく動作するか、というと気をつけなくてはいけないことがひとつあります。
フォアグラウンドジョブが無くなった場合です。
例えば、もっと時間がかかる処理を測定しようとして、time コマンドの出力先をリダイレクトして、シェルを終了させてしまう場合です。
% time 時間がかかる処理 > result.txt & % exit # 処理が終了する前に、抜けてしまう
フォアグラウンドジョブが無くなると、バックグラウンドジョブには HUP シグナルが送られます。
動かしているプロセスが HUP シグナルを受け取った動作はデフォルトが exit、つまりプロセスの終了なので、処理が中断される可能性が大きいです。
そういう場合には、nohup コマンドを使います。
% nohup time 時間がかかる処理 > result.txt & % exit # 処理が終了する前に抜けても、大丈夫 :-)
参考になる man は、以下のようなところになるでしょうか。
http://linuxjm.sourceforge.jp/html/procps/man1/kill.1.html
http://linuxjm.sourceforge.jp/html/GNU_sh-utils/man1/nohup.1.html
丁寧にご回答いただきありがとうございます。とてもわかりやすいです!!
2013/02/27 21:23:14>フォアグラウンドジョブが無くなった場合
仰るとおりです。nohupコマンドについては曖昧でしたので、大変助かりました。
ありがとうございました!!