時間のかかるCLIコマンドのお供にechoとBELを #AWSCLI

EC2 の start だったり CloudFront ディストリビューションのデプロイだったり、
数分単位で時間のかかる処理の完了を待つのに、AWS CLI の wait コマンドはすごく便利です。

でも wait コマンド自体は、指定した処理が完了したら静かに終了する、という動作1なので、
ふと気がついたら処理が終わっていた・終わったことに気付かなかった、ということがあって困ります。

こんな時、echo コマンドでベルを鳴らすと便利です。

本題の前に : AWS CLI の wait コマンドについて

ある処理が完了するまで終了しないコマンド(Waiters サブコマンド)です。

AWS CLIのWaitersによる待ち受け処理を実装する

例えば CloudFront のとあるディストリビューションで、
設定変更後に InProgress から Deployed になるまで待つ場合には、ディストリビューションID(例: EDFDVBD6EXAMPLE)を指定して下記のように実行します。

$ aws cloudfront wait distribution-deployed \
    --id EDFDVBD6EXAMPLE

ディストリビューションの更新(デプロイ)には通常15分程度かかりますが、
このコマンドを実行しておけば、デプロイが完了した(ステータス Deployed)段階でコマンドが正常終了します。

ただしこのままだと、
メッセージも出力せずそっと正常終了するだけなので、終わったことに気付きにくいですね。

本題1 : 後ろに echo を付ける

このような場合によくあるのは、&& に続けて echo で何かを出力させる、といった方法かと思います。

$ aws cloudfront wait distribution-deployed \
    --id EDFDVBD6EXAMPLE && echo 'deployed.'

deployed.
$

こうしておけば、コマンドが正常終了した場合に deployed. と表示されます。分かりやすいですね!

応用として、echo の代わりに echo-sd でより目立たせるのもありかと。

$ aws cloudfront wait distribution-deployed \
    --id EDFDVBD6EXAMPLE && echo-sd 'deployed'

_人人人人人人_
> deployed <
 ̄Y^Y^Y^Y^Y^Y^ ̄
$

ただしこれだけだと、結局ターミナルは一番手前に出していないと見えませんし、
別のタブで作業していたり、ほかのウィンドウを手前に置いていたりすると気付きにくいのは変わりません。

本題2 : BEL を鳴らす

そこで BEL(ベル)です。

echo -e '\a'とすると「ベルを鳴らす2」ことが出来ます。

$ aws cloudfront wait distribution-deployed \
    --id EDFDVBD6EXAMPLE && echo -e 'deployed.\a'

deployed.
$

大抵の場合なにかしらのサウンドが鳴ることになるかと思いますが、
職場だとボリュームを絞っていたり OFF にしていることも多いかと。

ですが今のターミナルソフトは「ベルが鳴った」ときに、いろいろと視覚的に通知をしてくれる機能があるので、そういったものを活用すると便利になります。

iTerm2 の場合(macOS)

デフォルトですと、下記の動作になります。

  • タブに「ベル(🔔)」のアイコンが表示
  • OSの通知センターに通知される(条件付き)

2番目の「通知センターに通知」がとても便利で、
別のタブで作業をしていたり、ターミナルがあるデスクトップとは別の操作スペースで作業していても通知がされるのでストレスがありません。

1

デフォルトで有効になっているとは思いますが、もし確認する場合は、
Preferences > Profiles > Terminal と進んで、「Send Growl/Notification Center alerts」にチェックが入っているかどうか確認して下さい。

2

ただし特定条件で通知してくれないことがあるので、それを回避するにはちょっと工夫が必要です(後述します)。

ターミナルの場合(macOS)

macOS標準のターミナルにも、ベルが鳴ったときの動作をコントロールすることが出来ます。

3

ベルが鳴ったとき、Dock のアイコンをジャンプさせることが出来るので、これが有効だと気付かないことは無くなりそうです。

それ以外の場合

すいません、メイン使いが Mac (iTerm2) なので他はあまり詳しくないのですが、
PuTTY には ベルが鳴った際にタイトルバーやタスクバーアイコンの色を変更するオプションがあるようです。

また Linux の場合、Terminator はデスクトップマネージャに通知する(urgent_hint)設定がある模様。

TeraTermRLogin、GNOME Terminal の場合は。。。ビジュアルベル(画面のフラッシュ等)で頑張るというのはどうでしょうか。

番外 : iTerm2 で必ず通知させるために

前述したように、
iTerm2 はいくつかの条件下3で、ベルが鳴っても通知してくれません。微妙にバグっぽい挙動にも感じますが定かではないです。

通知は確実に行われてほしいので、別の手を考えます。

幸い iTerm2 は、独自機能として、「通知センターにメッセージをPostする(Post a Growl notification)」という特殊なエスケープシーケンスを備えています。

これを使うと、好きなタイミングで好きなメッセージを macOS の通知センターに送信することが可能です。

ただし実際に使うとなると、ちょっと分かりにくい感じになりますね。。。

$ aws cloudfront wait distribution-deployed \
    --id EDFDVBD6EXAMPLE && echo -e 'deployed.\033]9;deployed.\a'

仕方ないので、
わたしは下記のようなシェルスクリプトを echonotice という名前で作成して使っています。

#!/bin/bash

MSG="$@"
echo -ne '\033]9;' $MSG '\a'
echo $MSG
$ aws cloudfront wait distribution-deployed \
    --id EDFDVBD6EXAMPLE && echonotice 'deployed.'

これであれば、確実に通知を受け取ることができて安心です。

4

まとめ

「設定変更はマネジメントコンソールから行う」という方でも、
作業後に AWS CLIの wait コマンドを仕掛けておくと、無駄な待ち時間を減らして効率的に作業が出来るかと思います。

また AWS 関係以外でも、例えばデータの集計やアプリの build など、コマンドラインから実行して数分以上時間がかかる処理というものはあるかと。

そんなときに、ちょっとだけ快適なる小技です。是非試してみて下さい。

脚注


  1. UNIX哲学 的です 
  2. ベル文字 - Wikipedia 
  3. 個人的には再現できているのですが、非常に説明しづらいのと、この記事はそれがメインではないので割愛します