実行中のプロセスの終了を検知して通知をするpeepというのを作った
https://github.com/Songmu/peep
なにかコマンドを実行して、思ったより時間がかかりそうな場合、終了を通知して欲しくなること、あると思います。それをしてくれるのが peep
です。言うなれば、 horenso の後付版です。
使い方はめちゃくちゃ簡単で、以下のようにpidと、その後に任意のコマンドを指定します。
% peep $pid -- /peth/to/notification-script
当該 $pid のプロセスが終了したら、指定したコマンドが動くという仕組みです。なんと、リモートプロセスの終了も検知できます。
インストール
go get
% go get github.com/Songmu/peep/cmd/peep
% go get github.com/Songmu/peep/cmd/peep-notify
Homebrew
% brew install Songmu/tap/peep
ghg
% ghg get Songmu/peep
GitHub releases
https://github.com/Songmu/peep/releases
使いかた
peep
を簡単に使うために peep-notify
というコマンドを用意しており、最初はそれを使うのが楽です。
% peep $pid -- peep-notify mac
サブコマンドに mac
を指定すると、デスクトップ通知をしてくれます。perl -E 'say $$; sleep 20
などとして、出力されたpidを $pid
部分に入れて試してみると良いでしょう。
peep-notify
は他には slack
と pushbullet
に対応しています。slackを利用する場合、SLACK_WEBHOOK_URL
、pushbulletの場合、PUSHBULLET_TOKEN
という環境変数が必要です。Slack通知は以下のような表示になります。
リモートプロセスをpeepする
これも簡単で、以下のように、 -H
オプションにsshターゲットを指定するだけです。
% peep -H user@hostname $pid -- /path/to/notify
カスタム通知コマンドを作る
通知コマンドは簡単に自作できます。単なるコマンドなので好きに書いて構いませんが、監視していたコマンドの実行結果を取得したい場合には、horenso
のreporter同様に、通知コマンドの標準入力に監視していたコマンドの実行結果がJSON形式で書き込まれるため、そこから取得すると良いでしょう。JSONは以下のようなフォーマットです。
{
"user": "Songmu",
"command": "perl -E say $$; sleep 10",
"startAt": "2018-12-31T17:29:56+09:00",
"endAt": "2018-12-31T17:30:07+09:00",
"host": "localhost",
"pid":20028
}
と言う感じで簡単に使えて便利なのでぜひご利用ください。
仕組み
内部実装は、なんのことはなく、非常に素朴で、 ps
コマンドを毎秒実行しているだけです。リモートの場合は5秒おきです。
できたきっかけ
年末年始でデータの整理をしていて、自宅のmacから仕事用のmacに音楽データをrsyncしたら思ってたより時間がかかってしまったので、こういうのが欲しいなーと思って作ったのでした。