SupervisordにXMLRPC経由で繋いでプログラムを開始/停止してみる


PythonのプログラムからSupervisor上のプロセスを操作したかったのでXMLRPCインタフェースを試してみた。

下準備
=============

supervisord.conf
---------------------

`inet_http_server`を有効にする。

```ini
[inet_http_server]         ; inet (TCP) server disabled by default
port=127.0.0.1:9001        ; (ip_address:port specifier, *:port for all iface)
;username=user              ; (default is no username (open server))
;password=123               ; (default is no password (open server))

[include]
files = conf.d/*.ini
```


conf.d/simplehttp.ini
---------------------

これは重要ではないですが念のため。
プログラム側の設定。virtualenvで動かしてるので`environment`の設定を追加。
プログラム自体は標準モジュールのシンプルHTTPサーバーを呼ぶだけ。

```ini
[program:simplehttp]
command=python -m SimpleHTTPServer ; the program (relative uses PATH, can take args)
process_name=%(program_name)s ; process_name expr (default %(program_name)s)
numprocs=1                    ; number of processes copies to start (def 1)
directory=/tmp                ; directory to cwd to before exec (def no cwd)
autostart=true                ; start at supervisord start (default: true)
autorestart=unexpected        ; whether/when to restart (default: unexpected)
stdout_logfile=/tmp/simplehttp.stdout ; stdout log path, NONE for none; default AUTO
stderr_logfile=/tmp/simplehttp.stderr ; stderr log path, NONE for none; default AUTO
environment=PATH=/Users/shrkw/.virtualenv/cpython-275/bin ; process environment additions (def no adds)
```

操作する
=================

導入は http://supervisord.org/api.html に書いてあるのでそこを見るとよいです。

以下はIPythonから操作してます。

XMLRPCインタフェースに接続
-------------------------------

>
In [1]: import xmlrpclib
In [2]: server = xmlrpclib.ServerProxy('http://localhost:9001')

メソッドを確認
-----------------

>
In [6]: server.system.listMethods()
Out[6]:
['supervisor.addProcessGroup',
 'supervisor.clearAllProcessLogs',
 'supervisor.clearLog',
 'supervisor.clearProcessLog',
 'supervisor.clearProcessLogs',
 'supervisor.getAPIVersion',
 'supervisor.getAllConfigInfo',
 'supervisor.getAllProcessInfo',
 'supervisor.getIdentification',
 'supervisor.getPID',
 'supervisor.getProcessInfo',
 'supervisor.getState',
 'supervisor.getSupervisorVersion',
 'supervisor.getVersion',
 'supervisor.readLog',
 'supervisor.readMainLog',
 'supervisor.readProcessLog',
 'supervisor.readProcessStderrLog',
 'supervisor.readProcessStdoutLog',
 'supervisor.reloadConfig',
 'supervisor.removeProcessGroup',
 'supervisor.restart',
 'supervisor.sendProcessStdin',
 'supervisor.sendRemoteCommEvent',
 'supervisor.shutdown',
 'supervisor.startAllProcesses',
 'supervisor.startProcess',
 'supervisor.startProcessGroup',
 'supervisor.stopAllProcesses',
 'supervisor.stopProcess',
 'supervisor.stopProcessGroup',
 'supervisor.tailProcessLog',
 'supervisor.tailProcessStderrLog',
 'supervisor.tailProcessStdoutLog',
 'system.listMethods',
 'system.methodHelp',
 'system.methodSignature',
 'system.multicall']


動いてる全プロセスの状況を確認
-----------------------

>
In [7]: server.supervisor.getAllProcessInfo()
Out[7]:
[{'description': 'pid 6624, uptime 0:09:45',
  'exitstatus': 0,
  'group': 'simplehttp',
  'logfile': '/tmp/simplehttp.stdout',
  'name': 'simplehttp',
  'now': 1412565184,
  'pid': 6624,
  'spawnerr': '',
  'start': 1412564599,
  'state': 20,
  'statename': 'RUNNING',
  'stderr_logfile': '/tmp/simplehttp.stderr',
  'stdout_logfile': '/tmp/simplehttp.stdout',
  'stop': 0}]

プロセス名を特定してプロセスの状況を確認
-----------------------------------

>
In [10]: server.supervisor.getProcessInfo('simplehttp')
Out[10]:
{'description': 'pid 6624, uptime 0:10:51',
 'exitstatus': 0,
 'group': 'simplehttp',
 'logfile': '/tmp/simplehttp.stdout',
 'name': 'simplehttp',
 'now': 1412565250,
 'pid': 6624,
 'spawnerr': '',
 'start': 1412564599,
 'state': 20,
 'statename': 'RUNNING',
 'stderr_logfile': '/tmp/simplehttp.stderr',
 'stdout_logfile': '/tmp/simplehttp.stdout',
 'stop': 0}

プロセスを止める
----------------------------------

>
In [11]: server.supervisor.stopProcess('simplehttp')
Out[11]: True

ちゃんと止まってるか、プロセスの状況を確認してみる。

>
In [12]: server.supervisor.getProcessInfo('simplehttp')
Out[12]:
{'description': 'Oct 05 11:15 PM',
 'exitstatus': -1,
 'group': 'simplehttp',
 'logfile': '/tmp/simplehttp.stdout',
 'name': 'simplehttp',
 'now': 1412565327,
 'pid': 0,
 'spawnerr': '',
 'start': 1412564599,
 'state': 0,
 'statename': 'STOPPED',
 'stderr_logfile': '/tmp/simplehttp.stderr',
 'stdout_logfile': '/tmp/simplehttp.stdout',
 'stop': 1412565323}

`STOPPED`ということで止まってる。

プロセスを動かす
----------------------------------

>
In [13]: server.supervisor.startProcess('simplehttp')
Out[13]: True

再開できました。