supervisorをちょっと試してみる

f:id:utr066:20180131191416p:plain

supervisorってものがよくわからないので、とりあえず試してみる。 良い感じにデーモン化してくれるみたいだけど、見えてこない。goのファイルを扱います。

vagrantで試してみる。

vagrantを立ち上げる

vagrantfile

centos6.7を使います。boxがなければインストールしましょう。

# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
  # The most common configuration options are documented and commented below.
  # For a complete reference, please see the online documentation at
  # https://docs.vagrantup.com.

  # Every Vagrant development environment requires a box. You can search for
  # boxes at https://vagrantcloud.com/search.
  config.vm.box = "centos6.7"

  # Disable automatic box update checking. If you disable this, then
  # boxes will only be checked for updates when the user runs
  # `vagrant box outdated`. This is not recommended.
  config.vm.box_check_update = false

  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine. In the example below,
  # accessing "localhost:8080" will access port 80 on the guest machine.
  # NOTE: This will enable public access to the opened port
  # config.vm.network "forwarded_port", guest: 80, host: 8080

  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine and only allow access
  # via 127.0.0.1 to disable public access
   config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"

  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  config.vm.network "private_network", ip: "192.168.33.12"

  # Create a public network, which generally matched to bridged network.
  # Bridged networks make the machine appear as another physical device on
  # your network.
  # config.vm.network "public_network"

  # Share an additional folder to the guest VM. The first argument is
  # the path on the host to the actual folder. The second argument is
  # the path on the guest to mount the folder. And the optional third
  # argument is a set of non-required options.
  config.vm.synced_folder ".", "/vagrant"

  # Provider-specific configuration so you can fine-tune various
  # backing providers for Vagrant. These expose provider-specific options.
  # Example for VirtualBox:
  #
  config.vm.provider "virtualbox" do |vb|
  #   # Display the VirtualBox GUI when booting the machine
  #   vb.gui = true
  #
  #   # Customize the amount of memory on the VM:
    vb.memory = "1024"
  end
  #
  # View the documentation for the provider you are using for more
  # information on available options.

  # Enable provisioning with a shell script. Additional provisioners such as
  # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
  # documentation for more information about their specific syntax and use.
  # config.vm.provision "shell", inline: <<-SHELL
  #   apt-get update
  #   apt-get install -y apache2
  # SHELL
end
$vagrant up
$vagrant ssh

goをインストール

$cd /usr/local/src/
$sudo wget https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz
$sudo tar -C /usr/local/ -xzf go1.9.linux-amd64.tar.gz
$echo "export GOPATH=/vagrant" >> $HOME/.bashrc
$echo 'export PATH=$PATH:$GOPATH/bin' >> $HOME/.bashrc
$echo 'export PATH=$PATH:/usr/local/go/bin' >> $HOME/.bashrc
$source $HOME/.bashrc

supervisorをインストール

$wget https://bootstrap.pypa.io/ez_setup.py -O - | python
$easy_install --version  # バージョン確認
$easy_install supervisor
$supervisord -v  # バージョン確認

supervisorの設定ファイルを作成する

/etc/supervisord.conf を作成する。 ここでsupervisorを起動した時に、どのアプリケーションを動かすかを指定できるみたい。[program]っていう部分。

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

[inet_http_server]
port=9001
username = admin
password = yourpassword

[supervisorctl]
serverurl = unix:///tmp/supervisor.sock

[supervisord]
logfile=/var/log/supervisord/supervisord.log
logfile_maxbytes=50MB
logfile_backups=10
loglevel=info
pidfile=/var/run/supervisord.pid
nodaemon=true
minfds=1024
minprocs=200
user=root
childlogdir=/var/log/supervisord/

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

[program:my_go_app]
command=/vagrant/src/src
//goのバイナリのパスを指定。
autostart = true
startsecs = 5
user = root
redirect_stderr = true
stdout_logfile = /var/log/supervisord/blogdemon.log

logのディレクトリを作る

sudo mkdir /var/log/supervisord

logファイルにはchmodで権限を与えます。

supervisor起動

sudo supervisord

上記を実行すると、こんな表示になる。

2018-01-31 08:32:21,478 INFO supervisord started with pid 2314
2018-01-31 08:32:22,482 INFO spawned: 'my_go_app' with pid 2317
2018-01-31 08:32:22,526 INFO exited: my_go_app (exit status 0; not expected)
2018-01-31 08:32:23,529 INFO spawned: 'my_go_app' with pid 2320
2018-01-31 08:32:23,544 INFO exited: my_go_app (exit status 0; not expected)
2018-01-31 08:32:25,552 INFO spawned: 'my_go_app' with pid 2323

設定ファイルで指定したprogramの名前が表示されている。

この部分。

[program:my_go_app]

/vagrant/srcgo buildするとバイナリが作成される。commandにはそのバイナリを指定すればいけるっぽい。 バイナリの名称がおかしいのは、とりあえずおいておく。

command=/usr/local/go/bin/go run /vagrant/src/main.go

バイナリ実行するんじゃなくて、go runでもいけるっぽいかな〜。 goコマンドのフルパスと実行したいファイル。

2018-01-31 08:32:23,544 INFO exited: my_go_app (exit status 0; not expected)

何度もこんな表示出てるからなんか起きてんのかなー、でもINFOだしなあ〜とか思いながらblogdemon.logの中見てみたら実行ファイルの標準出力結果は出ていました。stdout_logfileで指定したパスが標準出力の出力先になるようですね。

でも何回も実行しているみたいだから、1回の実行にしたい。 これも設定かあ。

そもそもデーモン化ってなんだよってところからやんないとなあ。