シェルスクリプトの処理完了をストレスなく待てるように可視化してみた

バッチプロセスが長時間に及ぶ際に進行状況を手軽に可視化するべく、小さめな汎用処理を書いてみました。
2019.02.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

バッチ等のシェルスクリプトは処理次第でとても長い時間待つ必要があったりします。応答がなくなって強制終了する必要が出ているのではないかと心配になるケースもあり、それなりのストレス元です。

問題が無いことを把握できるようにビジュアル化しつつ、なるだけ汎用的にこしらえてみました。

作り方

以下の2プロセスにわけます。

  • 実処理
  • 描写処理

実処理を描写処理の子プロセス化するだけです。

ソースコード

#!/bin/sh
python main.py &
chars="/-\|"
while [ "$(ps -ef | grep 'python main.py' | wc -l | awk '{print $1}')" -ne "1" ]; do
  for (( i=0; i<${#chars}; i++ )); do
    sleep 0.5
    printf "processing ... %s\r" "${chars:$i:1}"
  done
done

概要

先ず実処理を子プロセス化します。

python main.py &

次に描写プロセスを実行しますが、子プロセスの終了と共に中断させないと処理が完了しません。処理の終了そのものを認知する手段はいくつもあると思いますが、今回は実処理を同時に複数実行しない前提でやってみました。

while [ "$(ps -ef | grep 'python main.py' | wc -l | awk '{print $1}')" -ne "1" ]; do

ps -efの結果からmain.pyの実行プロセスを絞り込み、数をカウントして比較します。ただ、main.pyは絞り込みのためのgrepコマンドの引数にも含まれているため、比較する値は0ではなく1になります。

実行例

内容に反したスクリーンサイズとなってしまいましたが、イメージはわかると思います。

まとめ

待ち時間が数分以上で、且つ同時に複数実行しないプロセスであれば今回の処理で問題なくまかなえると思います。

アニメーション部分についてはシンプルなものにしてみましたが、解像度によっては見難い場合もあります。お好みでいじってみてください。