VisasQ Dev Blog

ビザスク開発ブログ

不死鳥MySQLを倒す

こんにちは、expert/lite開発チームの下山です。

今回はMySQLを止めたくても1人で止められなかったため、その備忘録として残します。

助けてくださった皆さん、ありがとうございます泣

環境

不死鳥MySQLを見てほしい

なぜか止まらないMySQL。 何度停止コマンドを入力しても、また復活し動き始めます。SUCCESS!の文字が恨めしい…ダメ元でKill(-9:強制終了オプション)しますが新たなプロセスとして蘇ります。

MacBook-Pro:~ xxxx$ mysql.server stop
Shutting down MySQL
.. SUCCESS! 


MacBook-Pro:~ xxxx$ mysql.server status
SUCCESS! MySQL running (17223)
MacBook-Pro:~ xxxx$ killall mysqld

MacBook-Pro:~ xxxx$ mysql.server status
SUCCESS! MySQL running (18154)
MacBook-Pro:~ xxxx$ killall -9 mysqld

MacBook-Pro:~ xxxx$ mysql.server status
SUCCESS! MySQL running (18256)

強い。

戦いの軌跡①

homebrewからインストールしたので、もしやbrewコマンドで止まるか?と考え以下コマンドを入力します。

MacBook-Pro:~ xxxx$ brew services stop mysql
Stopping `mysql`... (might take a while)
==> Successfully stopped `mysql` (label: homebrew.mxcl.mysql)

MacBook-Pro:~ xxxx$ mysql.server status
SUCCESS! MySQL running (18951)

はい。

戦いの軌跡②

親プロセスが生きている限り何度でも蘇るパターンじゃないか?という考えに至りました。 以下手順です。

①lsofコマンドで、ポート番号からプロセスを確認。通常MySQLのポート番号は3306なので、そのポートを利用しているプロセスを調べることができます。

// -i:ポート番号 でポートを指定
MacBook-Pro:~ xxxx$ lsof -i:3306

COMMAND   PID  USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
mysqld    19101   user.name   16u  IPv4 xxxxxxxxxxxxxxxxxx      0t0  TCP localhost:mysql (LISTEN)

②pstreeコマンドでプロセスの親子関係を調べる。lsofコマンドで確認したPID(今回は19101)を元に、親子関係を割り出します。

// インストールは下記コマンド
MacBook-Pro:~ xxxx$ brew install pstree 

// -s で親プロセスの表示(-sは--show-parentsを意味)
MacBook-Pro:~ xxxx$ pstree -s 19101

// 出力なし…つまり親プロセスはない

はい。

これで止める!

不死鳥MySQLですが、以下コマンドで停止しました。

MacBook-Pro:~ xxxx$  brew services stop mysql@5.7
Stopping `mysql@5.7`... (might take a while)
==> Successfully stopped `mysql@5.7` (label: homebrew.mxcl.mysql@5.7)


MacBook-Pro:~ xxxx$ mysql.server status
ERROR! MySQL is not running

こんなオチですみません。"brew services stop mysql@5.7"です、"@5.7"がなかった故に止められなかったのです...ウワー...。

brewでインストールしたmysqlが何度も蘇る仕組みとして、下記の記事によると、

macにはlaunchctlという仕組みがあり,plist定義を作っておくと,自動でデーモンを起動してくれる.これにmysqlが定義されていた.

brewでインストールしたmysqlが勝手に再起動するのを直す - Qiita

だそうです。brew services stop サービス名でlaunchctlの管理から除外できるようですが、今回のケースではそのサービス名が正しくなかったため止められませんでした。

あっけない終わりに見えますが、戦いの軌跡②で実施した内容が自分にとって良い勉強になりましたのでここに残します。この記事が誰かの解決の一助になれば幸いです。