supervisorでログのディレクトリをSIGUSR2を使って開き直す

  • supervisorをインストール
$ sudo yum -y install python-setuptools
$ sudo easy_install supervisor
$ echo_supervisord_conf > /etc/supervisord.conf
#!/bin/bash
while true ; do date ; sleep 1 ; done
  • /etc/supervisord.conf
[unix_http_server]
file=/tmp/supervisor.sock   ; (the path to the socket file)
[supervisord]
logfile=/var/log/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                ; (log level;default info; others: debug,warn,trace)
pidfile=/tmp/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)
childlogdir=/var/log/supervisor  ; ('AUTO' child log dir, default $TEMP)
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket
[program:hello]
priority = 100
command = sh /root/while.sh
redirect_stderr = true
  • supervisorを走らせる
$ mkdir /var/log/supervisor
$ supervisord -c /etc/supervisord.conf
  • ログが出力されているのか確認
$ tail -f /var/log/supervisor/hello-std*
==> /var/log/supervisor/hello-stdout---supervisor-4rZfjC.log <==
Wed Dec  4 10:32:17 UTC 2013
Wed Dec  4 10:32:18 UTC 2013
Wed Dec  4 10:32:19 UTC 2013
Wed Dec  4 10:32:20 UTC 2013
  • 状態を確認するためにプロセスを監視しておく
$ strace -e trace=open -p `pgrep supervisor`
  • /var/log/supervisor/を移動する
$ mv /var/log/supervisor /var/log/supervisor_old

tailで流しているログが流れ続けているか確認する。
ログが止まっていたりしたらがんばってください。

$ mkdir /var/log/supervisor_new
$ ln -s /var/log/supervisor_new /var/log/supervisor
$ ls -la /var/log/supervisor

http://supervisord.org/running.html

  • SIGUSR2を発行して新しいディレクトリの方にファイルを出力するか確認する

出力され続けていることを確認

$ ls -la /var/log/supervisor_old

SIGUSR2を発行

$ kill -SIGUSR2 `pgrep supervisor`

こんな感じでシグナルがやってきて

$ strace -e trace=open -p `pgrep supervisor`
Process 22859 attached - interrupt to quit
--- SIGUSR2 (User defined signal 2) @ 0 (0) ---
open("/var/log/supervisord.log", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3
open("/var/log/supervisor/hello-stdout---supervisor-4rZfjC.log", O_WRONLY|O_CREAT|O_APPEND, 0666) = 5

新しいディレクトリ(symlinkを貼った方に)にログが出力されはじめる

$ tail -f /var/log/supervisor/hello-std*
Wed Dec  4 10:03:42 UTC 2013
Wed Dec  4 10:03:43 UTC 2013
Wed Dec  4 10:03:44 UTC 2013
Wed Dec  4 10:03:45 UTC 2013
Wed Dec  4 10:03:46 UTC 2013
Wed Dec  4 10:03:47 UTC 2013

学ぶことは多い。