任意のプログラムを実行するとき開始/終了時のタイムスタンプを出力する方法

[update] <2010-03-30 火> シグナルで終了したときには、プロセスオブジェクトを表示してみた。

任意のRubyスクリプトを実行するとき開始/終了時のタイムスタンプを出力する方法 - 今日もスミマセン。はたしかに便利なのだが、わざわざRubyスクリプトに限定する必要はない。
次のようなスクリプトにしてしまえば、任意のプログラムのタイムスタンプを出力することができる。ついでに終了ステータスと経過時間も出力してみた。timestampという名前で保存する。

#!/usr/local/bin/ruby191
start_time = Time.now
cmdline = ARGV.join ' '
$stderr.puts "-" * 60
$stderr.puts "#{Time.now} start: #{cmdline}"
$stderr.puts "-" * 60

system *ARGV

secs = Time.now - start_time
$stderr.puts "-" * 60
$stderr.puts $?.inspect if $?.signaled?
$stderr.puts "#{Time.now} end: #{cmdline}"
$stderr.puts "%.2f seconds" % secs
$stderr.puts "exitstatus = #{$?.exitstatus}"
$stderr.puts "-" * 60

使い方はいたって簡単で、コマンドの前に timestamp をつけるだけ!

$ timestamp sleep 1
------------------------------------------------------------
2009-12-26 12:37:28 +0900 start: sleep 1
------------------------------------------------------------
------------------------------------------------------------
2009-12-26 12:37:29 +0900 end: sleep 1
1.01 seconds
exitstatus = 0
------------------------------------------------------------

追記

リダイレクト時にタイムスタンプが入ってしまうので、標準エラー出力に出すことにした。さっそくcronスクリプトに投入。

[2009/12/27]追記

「date; time sleep 1; date」でも実現できるじゃん→cronスクリプトでたくさんの行にこんなの入れるのはちょっと嫌。こっちだとデリミタを入れる等いろいろ自由がきくし。

なぜRubyで?→シェルスクリプトより得意だから。それだけw