Goアプリケーションをsupervisorでdaemonとして起動する

起動したGoのアプリケーションをdaemonプロセスとして動かす。なお、Centos6.7を使用している。

Supervisor: A Process Control System — Supervisor 3.3.3 documentation

Install

$ wget https://bootstrap.pypa.io/ez_setup.py -O - | python
$ easy_install supervisor
$ supervisord -v
3.3.3
  • yumでインストールすると古いバージョン(2.x.x系)がインストールされる。古いバージョンだとsupervisorctlコマンドでstartstopを実行した時にコマンドが返ってこないので注意

Configuration

設定ファイル(/etc/supervisord.conf)を作成する

設定は以下を参考にした。設定例は補足に記載。

SupervisorでGolangで書かれたアプリケーションのデーモン化をした話 - こんちゃんブログ

詳細は以下を参照

http://supervisord.org/configuration.html

How to use

各コマンドの詳細は以下を参照

http://supervisord.org/running.html

日本語だとこちらが詳しい

supervisorctlについて調べてみた - Masteries

supervisord

supervisorを起動するためのコマンド。以下のコマンドでsupervisorを起動する。なお、設定ファイルでautostart=trueと設定しているので、sueprvisordを起動するとGoアプリケーションも自動で立ち上がっている。

$ supervisord -c /etc/supervisord.conf

supervisorctl

supervisorでdaemonとして動かしたいアプリケーションの起動・停止するための主なコマンド

  • supervisorctl start <name>
  • supervisorctl stop <name>
  • supervisorctl restart <name>
    • supervisorの設定ファイルを再読込せずにアプリを再起動
  • supervisorctl update
    • supervisorの設定ファイルを再読込してアプリを再起動
  • supervisorctl status
$ supervisorctl start goapp
goapp: started
$ supervisorctl status
goapp           RUNNING   pid 2675, uptime 0:00:02

$ supervisorctl stop goapp
goapp: stopped
$ supervisorctl status
goapp           STOPPED   Dec 15 08:12 AM

$ supervisorctl restart goapp
goapp: stopped
goapp: started

$ ps aux | grep goapp
root      2681  0.0  0.2  46592  5416 ?        Sl   08:14   0:00 /go/bin/goapp

個人の感想

公式のドキュメントがしっかりしてて助かる

補足

設定ファイルの例

[unix_http_server]
file = /var/tmp/supervisor.sock
chmod = 0777
chown= root:root

[supervisord]
http_port=/var/tmp/supervisor.sock ; (default is to run a UNIX domain socket server)
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB       ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10          ; (num of main logfile rotation backups;default 10)
loglevel=info               ; (logging level;default info; others: debug,warn)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false              ; (start in foreground if true;default false)
minfds=1024                 ; (min. avail startup file descriptors;default 1024)
minprocs=200                ; (min. avail process descriptors;default 200)

[supervisorctl]
serverurl=unix:///var/tmp/supervisor.sock ; use a unix:// URL  for a unix socket

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[program:goapp]
command=/go/bin/goapp ; the program (relative uses PATH, can take args)
autostart=true              ; start at supervisord start (default: true)
autorestart=true            ; retstart at unexpected quit (default: true)