ハバナ式継続的デリバリー

Python, Ubuntu, JavaScript 色々知らなかった!のメモ

supervisorctlのreloadは設定ファイルの再読み込みではなく、supervisordの再起動

supervisorctlでreloadやっちまった(手遅れ)

プロセス監視ツール「Supervisor」はデーモンとクライアントの2構成になっているが、今回はクライアントアプリの方の話。

supervisorctlコマンドでは監視対象の設定ファイル再読み込みやプロセス再起動ができるが、

  • reread
  • restart
  • reload

このように似たような名前のサブコマンドが複数あって、みんな同じに見える。
「ただのエイリアスなの?」と思ってよく考えず実行すると大変なことになるので注意である。

わたしは、reloadを監視対象の設定ファイルの再読み込みと思い込んでいて、特に気にもせず

$ sudo supervisorctl reload mysite

と実行してしまった。

ところが返ってきたメッセージは

Restarted supervisord

である。そう、supervisordの方が再起動してしまうのである。

supervisorctlのヘルプを見よう

supervisorctl help ??? とするとサブコマンドのヘルプが見られる。

まず、reread

cultureeen@ubuntu:~$ sudo supervisorctl help reread
reread 			Reload the daemon's configuration files

設定ファイルの再読み込みである。
そして、これは特定の名前を指定して実行するコマンドではない。
全部再読み込みするのだ。

試しに実行してみると

cultureeen@ubuntu:~$ sudo supervisorctl reread
monitoring: disappeared  # ファイルが消されて存在しなくなった場合など
portal: changed  # 変更された

このように、すべてのプロセスの設定を読み込み直す。

次に、restartだが

cultureeen@ubuntu:~$ sudo supervisorctl help restart
restart <name>		Restart a process
restart <gname>:*	Restart all processes in a group
restart <name> <name>	Restart multiple processes or groups
restart all		Restart all processes

この通り、プロセスの再起動である。そして、個別に再起動できる(全部まとめて再起動もできる)。

最後に、reloadである。

cultureeen@ubuntu:~$ sudo supervisorctl help reload
reload 		Restart the remote supervisord.

この通り、デーモンの方を再起動してしまう。もちろん個別のプロセス名を渡しても無駄である。

名前を指定できるのはrestartだけ

せっかくなのでもう一度まとめておこう。

$ sudo supervisorctl restart mysite

これはOK。mysiteプロセスを再起動する。

$ sudo supervisorctl reread mysite

引数"mysite"は無意味。すべての設定ファイルが読み込み直される。

$ sudo supervisorctl reload mysite

引数"mysite"はもちろん無意味。supervisordの方が再起動する。

ちなみに、

$ sudo supervisorctl restart  # 何も指定しない

とすると以下の通りエラーになる。全部再起動したいときは"all"を明示的に指定しろと。

Error: restart requires a process name
restart <name>		Restart a process
restart <gname>:*	Restart all processes in a group
restart <name> <name>	Restart multiple processes or groups
restart all		Restart all processes

supervisordを再起動せず監視対象を増やすときはrereadの後add

更に、supervisordを再起動せず監視対象を増やしたいときはまずrereadしてaddをするそうだ。

適当なスクリプトをデーモン化するのにSupervisorが便利 - id:anatooのブログ

supervisordを再起動せずに追加したい場合は、以下みたいにrereadで設定ファイルを再読み込みしてからaddする。

$ supervisorctl reread
$ supervisorctl add tiarra

最後にひとりごと

"reread"って名前、わかりにくいし言いづらいから単に"read"とか"reconfigure"にすればいいのに(小声)