rerun
というコマンドランナーを Go で書きました。rerun を使って、コマンドを実行すると、コマンドが終了した際に再実行してくれます。systemd や supervisord の簡易版と言えばイメージしやすいかもしれません。
動作イメージ
下記では、rerun で sample.sh が終了する度に再実行しています。
動機
Kubernetes クラスタを Mac 上の Docker Desktop 環境で開発している際、実行状況が分かるように、いくつかのログをターミナルで出力していました。例えば、kubectl get events -w
などです。ただ、開発中に Docker Desktop が落ちることがあると、kubectl get events
も一緒に終了してしまうので、Docker Desktop に合わせて、それらもいちいち起動し直すのが面倒でした。
そこで、こうした手間を省くために作ったのが、rerun です。
rerun
rerun コマンドの後に実行したいコマンドを指定します。rerun を実行すると、指定したコマンドを実行します。もし、コマンドが終了した場合、一定秒数経過後(デフォルト: 10s)に再びコマンドを実行します。
# sample.sh が終了したら、10 秒後に再実行
$ rerun ./sample.sh
-s
オプションで、再実行までの秒数を指定できます。
# sample.sh が終了したら、1 秒後に再実行 $ rerun -s 1 ./sample.sh
実行したいコマンドにハイフン -
が含まれる場合は、コマンドの前に —
を付けて実行します。
$ rerun -- kubectl get events -w
インストール
rerun は、Go で実装したシングルバイナリなので、macOS / Linux 環境では、下記サイトよりバイナリをダウンロードすれば利用できます。
https://github.com/shin1x1/rerun/releases
go get
でもインストールできます。
$ go get -u github.com/shin1x1/rerun
さいごに
簡単な仕組みのツールですが、個人的には重宝していて、わりと便利に使ってます。最近は、下記のように Docker Desktop 自体を rerun で起動して、Docker が落ちても自動で起動するようにしています。
$ rerun /Applications/Docker.app/Contents/MacOS/Docker
サーバのデーモンを起動したりするなら、systemd なり、supervisord などを使う方が良いと思いますが、開発用端末ではわりと使えているので、同じようなユースケースがあれば試してみてください。