こんにちは、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 services stop サービス名
でlaunchctlの管理から除外できるようですが、今回のケースではそのサービス名が正しくなかったため止められませんでした。
あっけない終わりに見えますが、戦いの軌跡②で実施した内容が自分にとって良い勉強になりましたのでここに残します。この記事が誰かの解決の一助になれば幸いです。