Help us understand the problem. What is going on with this article?

BitBarでMySQLサーバーの状態を常に意識する

More than 3 years have passed since last update.

はじめに

皆さんはローカルのマシンで起動しているプロセスをチェックしていますか?もちろん通常のデスクトップOSで起動しているプロセスをすべて把握するなんて現実的ではありませんが、開発用のサーバープロセスがちゃんと起動しているかなどは把握しておくべきですよね?せめてMySQLくらいは起動しているか否かくらいを把握したいものです。

ローカルで動かすMySQLサーバー

Homebrewでインストール

私はMySQLをHomebrewでインストールしています。どうやらMySQL本家から手に入るインストーラーでインストールすると、メニューバーに起動中か否かの表示がされ、システム環境設定で起動/停止をコントロールすることができるようですね。羨ましいです。

状態に気が付かない

私はMySQLを自動起動にしていないせいで、システムの再起動後にMySQLのサービスを起動することが忘れることが多発します。プロセスが起動しているかどうかを把握しておらず、開発中のWebアプリがエラーを返すのでなぜかなーと探っていた末にMySQLが起動していなかったことに気がつくなんてことがしょっちゅうあります。

起動/停止はコマンドライン

サービスを起動していないことに気がついて起動しようとしますが、ターミナルを起動してShellが読み込まれるのを待ち、コマンドをタイプして実行します。「あ〜、起動するの忘れてた〜!」と気がついてからすでに数10秒経過しています。これはテンポが悪い。

BitBar

どうせならメニューバーでシステムの状態を確認でき、サービスが停止していればメニューを選択して起動できると幸せになれそうです。

メニューバーと言えば、皆さんお馴染みのBitBarですよね。僕はここ最近、珍しくQiitaに記事を書いたりしています。

こうなったらMySQLの状態を把握し、プロセスの起動/停止をコントロールするようなBitBarプラグインを書いてしまいましょう。

実装

表示するのはMySQLサーバーの状態と、プロセスの起動/停止を指示するメニュー項目です。

そんなこんなで作成したプラグインがこちらです。

mysql-status.1m.sh
#!/usr/bin/env bash
# <bitbar.title>MySQL server status</bitbar.title>
# <bitbar.version>v1.1</bitbar.version>
# <bitbar.author>Kenji Akiyama</bitbar.author>
# <bitbar.author.github>artifactsauce</bitbar.author.github>
# <bitbar.desc>Show the status of MySQL server installed by Homebrew on localhost and manage server boot with shortcut menus</bitbar.desc>
# <bitbar.image>http://i.imgur.com/Y85ENFb.png</bitbar.image>
# <bitbar.dependencies>bash,mysql</bitbar.dependencies>

set -eu

# Change here depending on your preference
MENUBAR_ICON_ENABLED=":dolphin:"
MENUBAR_ICON_DISABLED=":sleepy:"
STATUS_ITEM_COLOR="green"
DISABLED_ITEM_COLOR="#C0C0C0"

# Below is no need to change basically.
SERVER_CMD="/usr/local/bin/mysql.server"

SUBCMD_START="start"
SUBCMD_STOP="stop"
SUBCMD_RESTART="restart"
SUBCMD_RELOAD="reload"
SUBCMD_F_RELOAD="force-reload"
SUBCMD_STATUS="status"

if $SERVER_CMD $SUBCMD_STATUS | grep -Fq 'SUCCESS'; then
  IS_SERVER_RUNNING=true
  echo "$MENUBAR_ICON_ENABLED"
else
  IS_SERVER_RUNNING=false
  echo "$MENUBAR_ICON_DISABLED"
fi

# Server Status from `mysqladmin status`
if $IS_SERVER_RUNNING; then
  echo "---"
  LF=$'\\\x0A' # return code
  /usr/local/bin/mysqladmin -u root status | sed -e "s/$/  /" | sed -e "s/  / \| color=$STATUS_ITEM_COLOR $LF/g"
fi

# Server management shortcuts
echo "---"
if $IS_SERVER_RUNNING; then
  echo "Start | color=$DISABLED_ITEM_COLOR"
  echo "Stop | bash=$SERVER_CMD param1=$SUBCMD_STOP refresh=true terminal=false"
  echo "Restart | bash=$SERVER_CMD param1=$SUBCMD_RESTART refresh=true terminal=false"
  echo "Reload | bash=$SERVER_CMD param1=$SUBCMD_RELOAD refresh=true terminal=false"
  echo "Force-reload | bash=$SERVER_CMD param1=$SUBCMD_F_RELOAD refresh=true terminal=false"
else
  echo "Start | bash=$SERVER_CMD param1=$SUBCMD_START refresh=true terminal=false"
  echo "Stop | color=$DISABLED_ITEM_COLOR"
  echo "Restart | color=$DISABLED_ITEM_COLOR"
  echo "Reload | color=$DISABLED_ITEM_COLOR"
  echo "Force-reload | color=$DISABLED_ITEM_COLOR"
fi

echo "---"
echo "Refresh | refresh=true color=$DISABLED_ITEM_COLOR"

解説

起動/停止コマンド

いつの頃からか、MySQLには mysql.server というサーバーの起動/停止をコントロールするためのShellスクリプトが付属しています。Homebrewでインストールした場合には /usr/local/bin/mysql.server にSymlinkが張られています。このスクリプトは引数に start, stop, restart, reload, force-reload, status というの文字列を取ることができます。

これをメニューから実行するためには下記のように出力されるようにします。

Start | bash=/usr/local/bin/mysql.server param1=start refresh=true terminal=false

refresh は実行後に表示内容を再生成するか否かを指定します。また、 terminal は実行時に新たなターミナル画面を起動するか否かを指定します。

さて、 status で出力される内容は下記のようなもので、起動/停止を把握するには十分ですが、できればもう少し情報があった方がありがたいですね。

起動時: SUCCESS! MySQL running (22331)

停止時: ERROR! MySQL is not running

mysqladminでステイタスを取得

そこで mysqladmin コマンドを利用します。 mysqladmin はMySQL管理者コマンドをShellから使えるようにしたコマンドラインツールです。 mysqladmin で端的なサーバーの状態を表示するサブコマンドが status です。

$ /usr/local/bin/mysqladmin -u root status
Uptime: 5  Threads: 1  Questions: 4  Slow queries: 0  Opens: 67  Flush tables: 1  Open tables: 60  Queries per second avg: 0.800

しかしその出力は横に長く、メニューに表示するには合いません。

sed で改行コードに置換する

出力をよく見ると、KeyとValueの間は : と半角スペースで区切られていますが、それぞれの項目はダブルスペースで区切られています。ダブルスペースを改行に変換すれば良い感じに表示できそうです。

というわけで sed を使って変換してみましょう。

$ /usr/local/bin/mysqladmin -u root status | sed -e "s/  /\n/g"
Uptime: 518nThreads: 1nQuestions: 22nSlow queries: 0nOpens: 67nFlush tables: 1nOpen tables: 60nQueries per second avg: 0.042

あ…れ?なんか n って文字が入っています。エスケープを重ねてもダメなようです。 \n では改行コードとして認識してもらえないようです。

そこでこのように書きます。

$ export LF=$'\\\x0A'; /usr/local/bin/mysqladmin -u root status | sed -e "s/  /$LF/g"
Uptime: 858
Threads: 1
Questions: 46
Slow queries: 0
Opens: 67
Flush tables: 1
Open tables: 60
Queries per second avg: 0.053

sed で行末に文字列を追加する

期待したとおりに改行して表示されたところで、文字色を変更したいと思います。文字色は例えば下記のような記法で表現します。各行の出力に対し、文字色等の指定が必要です。

Uptime: 858 | color=red

前述の sed の変換に組み込んでみましょう。

$ export LF=$'\\\x0A'; /usr/local/bin/mysqladmin -u root status | sed -e "s/  / \| color=green $LF/g"
Uptime: 6015 | color=green
Threads: 1 | color=green
Questions: 66 | color=green
Slow queries: 0 | color=green
Opens: 67 | color=green
Flush tables: 1 | color=green
Open tables: 60 | color=green
Queries per second avg: 0.010

あ…れ?最後の行だけ文字色が付いていません。なるほど。行末にはダブルスペースが無いので変換されないわけですね。だったら行末にダブルスペースを付ければ良いわけですね。

ここではスッキリ書くために、 sed を使って書いてみましょう。

$ export LF=$'\\\x0A'; /usr/local/bin/mysqladmin -u root status | sed -e "s/$/  /" | sed -e "s/  / \| color=green $LF/g"
Uptime: 6323 | color=green
Threads: 1 | color=green
Questions: 78 | color=green
Slow queries: 0 | color=green
Opens: 67 | color=green
Flush tables: 1 | color=green
Open tables: 60 | color=green
Queries per second avg: 0.012 | color=green

はい。期待通りに出力されました。最後に改行が入っていますが、まあメニュー上での表示に問題がないので良しとしましょう。

Pull Request

僕にしては珍しく人の役に立ちそうなプラグインを作成した上に、なぜか公式リポジトリには似たようなものも無いようだったので、これをPull Requestに出してみました。結果的には前回を上回る速さでマージしていただきました。素晴らしいです。リポジトリを見る限り、プラグインコミュニティーはやや盛り上がってない感じがありますが、活動はそれなりに活発を保っているようです。安心しました。

最後に

地味なフラストレーションも解消され、承認欲求も満たされ、大変幸せです。ちなみに上述のコードは本家のリポジトリにマージされたコードを少し修正したものです。メニュー表示に問題が発見されたのですが、気になる方は diff でも見てみてください。もう少し修正が溜まったら再度リリースするつもりです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away