Shin x Blog

PHPをメインにWebシステムを開発してます。Webシステム開発チームの技術サポートも行っています。

rerun - コマンドが終了したら自動で再実行するツールを作りました

rerun というコマンドランナーを Go で書きました。rerun を使って、コマンドを実行すると、コマンドが終了した際に再実行してくれます。systemd や supervisord の簡易版と言えばイメージしやすいかもしれません。

github.com

動作イメージ

下記では、rerun で sample.sh が終了する度に再実行しています。

screencast

動機

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 などを使う方が良いと思いますが、開発用端末ではわりと使えているので、同じようなユースケースがあれば試してみてください。