おそらくはそれさえも平凡な日々

実行中のプロセスの終了を検知して通知をする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 は他には slackpushbullet に対応しています。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したら思ってたより時間がかかってしまったので、こういうのが欲しいなーと思って作ったのでした。

created at
last modified at

2019-01-02T01:10:03+0900

comments powered by Disqus