monolithic kernel

コマンドの実行完了をTwitterで通知する

計算機にある程度時間の掛かる処理をさせていると、いつ終わるのか何度も画面をチェックしてしまう、あるいは他の作業をしていたら処理を走らせていたことをすっかり忘れてしまう、ということはないでしょうか。特に、処理中に計算機から離れているような場合、処理が完了するタイミングを正確に把握できないといろいろ面倒です。処理時間が確定しているのであれば、時間を覚えておくとか何かしらのタイマーを設定するという手もありますが、毎回覚えたり設定したりするのは面倒ですし、そもそも計算機に何かをさせる場合に、その処理時間を事前に正確に把握できることはまれです。

そこで、処理が完了した際にスマートフォンにプッシュ通知を送って離れた場所でもコマンドの完了を把握できるようにしてみました。Twitterを利用しているのは、はじめに思いついたのがTwitterで、実際にやってみたら簡単に実現できてしまったからで、他のチャットツールやメール、あるいはYoなんかでも問題ありません。持っていないのでわかりませんが、Pushoverなどを購入しているのであれば、そちらを使ったほうがいいのかもしれません。

導入

今回は、CLIでコマンドを実行する場合の通知を対象とするため、CLIで利用可能な形のメッセージ送信ツールが必要です。今回は、tというRubyで書かれたCLIのTwitterクライアントを選択しました。tはgemとして提供されているので、以下のようにインストールできます。

$ gem install t

ツイートはt updateコマンドで行います。事前にt authorizeコマンドでOAuthの設定を済ませておく必要があります。

$ sleep 1000; t update '@mono0x done'

これで、;の前のコマンドが終わるとTwitterで通知してくれるようになります。簡単ですね。

問題点と対処

ただ、これだけだといくつか問題があります。まず、毎回@を飛ばしているとあっという間にメンションがこの通知で埋まってしまいます。加えて、毎回同じ内容のツイートだとTwitter側に弾かれて届きません。そして、なによりt update ...というのは毎回打つには面倒です。

通知が埋まる問題は、通知内容をツイートする専用のアカウントを作成し、そのアカウントのツイートを通知するようにアプリで設定すれば解決できます。

対象となるアカウントのページで設定ボタンをタップし、

通知設定1

「通知をオンにする」を選択してください。

通知設定2

この設定ができるのは (おそらく) 公式のTwitterアプリだけだと思いますが、他のクライアントをお使いの方も、この機能のためだけに公式クライアントをインストールしておく価値はあると思いますよ。

同じ内容が弾かれてしまう、毎回打つのが面倒という問題に対しては、以下のzshの関数を利用することで対処できます。

n() {
  local dt
  dt=`date '+%m/%d %H:%M:%S'`
  $*
  t update "done: $* => $? ($dt)" > /dev/null 2>&1
}

この関数は、上の例とは異なり、以下のように利用します。timeコマンドのようなイメージですね。

$ n sleep 1000

t update ...と比べるとかなり楽になったのではないかと思います。また、この関数ではツイートする内容にコマンド名や時刻を埋め込むことで、ツイートの内容が重複することを回避しています。