その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

実行中のプログラムの進捗度を手っ取り早く確認したい

完了するまでに結構時間がかかるプログラムを実行している時,そのプログラムの進捗度を確認したくなることがままあると思います.ほんとに動いてんのかお前,みたいな.


そうした時に考えうる最も簡単な方法は,こんな感じで進捗度を標準出力に流してしまうという方法でしょう.

(1..100).each do |i|
  # 例えばここで何らかの重い処理をする (下のsleepはその「何らかの処理」の例)
  sleep 0.1 
 
  # ここで進捗を表示 (プログレスバーみたいなもっとリッチな感じでも可)
  puts "#{i}%"
end

簡単なものだとこれで良いでしょうが,途中で端末のセッションが切れると「アッアッ」という感じになったり,そもそもプログラムの実行に際して端末が割り当てられいるとも限らないし,というか時間のかかるプログラムがその処理中ずっと端末を占領しているのはつらいので別の方法が欲しかったりします.


というわけで

orig_program_name = $0
 
(1..100).each do |i|
  # 例えばここで何らかの重い処理をする (下のsleepはその「何らかの処理」の例)
  sleep 0.1 
 
  # ここでプログラム名上書きして進捗を載せる
  $0 = "#{orig_program_name}(#{i}%)"
end

このように自分のプログラム名を書き換えて進捗を追記すると良さそう.ps | grepとかで引っ掛けることで進捗を確認できるので便利!

プログラム名に表示される進捗を別のプログラムが監視して,ある閾値を超えたら特定の処理を走らせる,みたいなこともまあ出来そう.原始的なIPCっぽさを感じる今日このごろです.