PythonのプログラムからSupervisor上のプロセスを操作したかったのでXMLRPCインタフェースを試してみた。
下準備
supervisord.conf
inet_http_server
を有効にする。
[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サーバーを呼ぶだけ。
[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
再開できました。