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"にすればいいのに(小声)