supervisorによるlinuxへのgowebプロジェクトの導入


最近ではgolangガードプロセスの実現を煽っていて、supervisorという面白いものを何気なく見つけました.supervisorはunixのシステムプロセス管理ソフトウェアで、apache、nginxなどのサービスを管理することができ、サービスが切れたら自動的に再起動することができます.もちろんgolangのデーモンプロセスを実装するためにも使用できますが、以下に具体的な実装について説明します.
supervisorのインストール
centos 6.4に基づく.
supervisorはpythonで作成され、easy_インストールします.centosにはpythonの実行環境がデフォルトであり、インストールは非常に簡単です.
$ sudo yum install python-setuptools
$ sudo easy_install supervisor

エラーが表示されなければ、インストールに成功し、echoを使用できます.supervisord_confは構成の詳細を表示し、プロファイルを生成します.
$ sudo echo_supervisord_conf > /etc/supervisord.conf

golang httpサービス
まず簡単なgolang httpサービスを整えます
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
packagemain
 
import(
    "fmt"
    "log"
    "net/http"
)
 
funcmain() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello world")
    })
 
    err := http.ListenAndServe(":9090", nil)
    iferr != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}
このプログラムを直接実行すると端末が占有され、supervisorでこのプログラムを走る方法を見てみましょう.
supervisor構成golang
編集/etc/supervisord.conf、最後に実行プログラム設定を追加
[program:golang-http-server]
command=/home/golang/simple_http_server
autostart=true
autorestart=true
startsecs=10
stdout_logfile=/var/log/simple_http_server.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/var/log/simple_http_server.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB

いくつかの構成の説明:
command:実行するコマンドを表し、完全なパスを記入すればいいです.Autostart:supervisorとともに起動するかどうかを示します.Autorestart:プログラムが停止した場合、再起動しますか.stdout_logfile:ターミナル標準出力リダイレクトファイル.stderr_logfile:ターミナルエラー出力リダイレクトファイル.
その他の構成説明は、公式ドキュメントを表示できます.
supervisorの起動
$ sudo /usr/bin/supervisord -c /etc/supervisord.conf

何か問題が発生した場合は、ログを表示して分析できます.ログファイルパス/tmp/supervisord.log
tips:
    1.コンフィギュレーションファイルを変更した場合はkill-HCPでコンフィギュレーションファイルを再ロードできます
$ cat /tmp/supervisord.pid | xargs sudo kill -HUP

     2.ファイルの実行に失敗したのは、ファイルに実行権限がないためかもしれません.ファイルの実行権限を付与する必要があります.
chmod 777 filename

supervisorの実行ステータスの表示
$ supervisorctl
golang-http-server RUNNING pid 23307, uptime 0:02:55
supervisor>

ヘルプを表示するにはhelpを入力します
supervisor> help
default commands (type help ):
=====================================
add clear fg open quit remove restart start stop update
avail exit maintail pid reload reread shutdown status tail version

supervisor運転原理
supervisor実行後自体がデーモンプロセスであり,自身で対応するサブプロセスを管理することで,対応するプロセス状態を観察することで明らかになった.
$ ps -ef | grep supervisord
root 23306 1 0 07:30 ? 00:00:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
root 23331 23222 0 07:41 pts/0 00:00:00 grep supervisord

$ ps -ef | grep simple_http_server
root 23307 23306 0 07:30 ? 00:00:00 /home/golang/simple_http_server
root 23333 23222 0 07:41 pts/0 00:00:00 grep simple_http_server

golang simpleを直感的に見ることができますhttp_serverプロセスはsupervisordのサブプロセスです.