supervisor(一)基礎編

20621 ワード

supervisorというものは、実はプロセスを管理するために使われています.なぜsupervisorを使うの?なぜなら、私たちのlinuxの伝統的なプロセス管理方式に比べて、それは多くの優位性を持っています.そうしないと、私たちはsupervisorを使う暇がありません.OK、次はsupervisorのメリットを見てみましょう.
  • 簡単なのはなぜ簡単ですか?通常linuxプロセスを管理する場合、通常はプロセスstart/stop/restart/reload機能を実現できるスクリプトを自分で作成し、/etc/initに捨てる必要があります.d/以下.このようにするには多くの悪いところがあります.まず、このスクリプトを書くには、時間と労力がかかります.第二に、このプロセスが停止したとき、linuxは自動的に再起動しません.自動的に再起動したい場合は、自分で監視再起動スクリプトを書く必要があります.一方、supervisorはこれらの問題を完璧に解決することができます.はい、どのように解決しますか.実はsupervisor管理プロセスは、fork/execの方法でこれらの管理されているプロセスをsupervisorのサブプロセスとして起動します.これでは、supervisorのプロファイルに、管理するプロセスの実行可能ファイルのパスを書き込めばOKです.これにより、linux管理プロセスのように、自分で制御スクリプトを書く手間が省けます.第二に、管理プロセスはsupervisorのサブプロセスとして、サブプロセスが停止したとき、親プロセスはサブプロセスが停止した情報を正確に取得することができるので、もちろん停止したサブプロセスを自動的に再起動することができます.もちろん、再起動するか再起動しないかは、プロファイルの中にautostart=trueが設定されているかどうかによって決まります.これは後の話です.
  • 正確なのはなぜ正確なのか.linuxのプロセス状態へのフィードバックは、あまり正確ではない場合があります.どうして正確じゃないの?このスレ主も知らないですね.公式のドキュメントはそう言っています.知っていることをスレ主に教えてください.感謝しています.supervisorはサブプロセスを監視し、得られたサブプロセスの状態は間違いなく正確である.
  • プロセスグループsupervisorはプロセスグループを統一的に管理することができます.つまり、管理するプロセスをグループに書くことができます.そして、このグループをオブジェクトとして管理します.例えば、起動、停止、再起動などの操作を行います.linuxシステムにはこのような機能はありません.私たちはプロセスを停止したいのですが、1つずつ停止するか、自分でスクリプトを書いて一括停止するしかありません.
  • 集中管理supervisor管理のプロセス、プロセスグループ情報は、すべてini形式のファイルに書けばOKです.また、supervisorを管理するときは、ローカルで管理したり、リモートで管理したりすることができます.また、supervisorはwebインタフェースを提供しています.私たちはwebインタフェースでプロセスを監視したり、管理したりすることができます.もちろん、ローカル、リモート、Web管理の場合、supervisorのxmlを呼び出す必要があります.rpcインタフェース、これも後話です.
  • 有効性supervisorのサブプロセスが停止すると、オペレーティングシステムはsupervisorに直接信号を送信します.他のsupervisorのようなツールは、プロセスのpidファイルを通じて信号を送信し、定期的にポーリングして失敗したプロセスを再起動します.明らかにsupervisorはもっと効率的です...どのようなsupervisorツールに似ているのか、このスレ主はよく分かりません.スレ主はgod、directorを聞いたことがありますが、使ったことがありません.興味のある方は
  • をプレイできます
  • 拡張性supervisorはオープンソースソフトウェアで、牛が追い詰めて、直接ソフトウェアを変更することができます.しかし、多くの人はsupervisotが提供するインタフェースを正直に研究しています.supervisorは主に2つの拡張可能な機能を提供しています.一つはeventメカニズムで、これはスレ主がこの2日間やった仕事で使うものです.もう一つはxml_rpc、supervisorのweb管理側とリモートコールのときに使います.
  • 権限linuxのプロセス、特に1024ポートの下にあるプロセスをリスニングする権限は、一般的なユーザーの多くは制御できません.制御するにはroot権限が必要です.supervisorは、supervisordまたはサブプロセスごとにroot以外のuserを設定する機能を提供し、このuserは対応するプロセスを管理することができます.しかし、この機能は、使わなくてもみんなの環境を見て、互換性、安定性、役に立たないと感じて、話をしません.

  • インストール
    インストール方法は簡単です.スレ主のシステムはdebianで、その他のシステムは言いません
    aptitude -y install python-setuptools
    easy-install supervisor
      
    pip install supervisor
    

    プロファイルの生成
    supervisorをインストールした後、デフォルトではプロファイルは生成されません.以下のコマンドでプロファイルecho_supervisord_conf > /etc/supervisord.confを生成できます.通常、プロファイルを/etc/の下に配置します.もちろん、任意のパスの下に配置することもできます.
    開始
    以下の起動順序は、上から下への優先順位で、順次減少します.
    supervisord                                   #    $CWD/supervisord.conf,       
    supervisord                                   #  $CWD/etc/supervisord.conf,        etc  
    supervisord                                   #    /etc/supervisord.conf     
    supervisord -c /home/supervisord.conf         #            
    

    supervisorコンポーネント
  • supervisord supervisordはsupervisorのサービス側プログラムです.作業:supervisorプログラム自体を起動し、supervisor管理のサブプロセスを起動し、clientsからの要求に応答し、フラッシュバックまたは異常終了のサブプロセスを再起動し、サブプロセスのstderrまたはstdoutをログファイルに記録し、Event
  • を生成および処理する.
  • supervisorctlこれは少し役に立ちます.supervisordがsupervisorのサービスエンドプログラムだとしたら、supervisorctlはclientエンドプログラムです.supervisorctlには、サブプロセスのステータスを表示したり、サブプロセスを起動/停止/再起動したり、runningサブプロセスのリストを取得したりするタイプのshellのコマンドラインインタフェースがあります.最もすごい点は、supervisorctlは自機のsupervisordに接続できるだけでなく、遠隔のsupervisordにも接続できることです.もちろん、自機の上ではUNIX socketで接続されており、遠隔はTCP socketで接続されています.supervisorctlとsupervisordの間の通信はxml_を通じてrpcが完成しました.対応する構成は[supervisorctl]ブロックの
  • にある.
  • WebサーバWebサーバは主にインタフェース上でプロセスを管理することができ、Webサーバは実はXML_を通じてRPCは、supervisorにデータを要求したり、supervisorやサブプロセスを制御したりすることができます.[inet_http_server]ブロック内に配置する
  • XML_RPCインタフェースこれはリモートコールで、上のsupervisorctlとWebサーバは
  • です.
    プロファイルの詳細
    [unix_http_server]            
    file=/tmp/supervisor.sock   ; socket     ,supervisorctl XML_RPC supervisord         
                                   。       ,supervisorctl        
                                       ,   none。              
    ;chmod=0700                 ;     ,         socket      0700
                                       ,   0700。      
    ;chown=nobody:nogroup       ;     ,       socket      user.group
                                       ,     supervisord        。     
    ;username=user              ;   supervisorctl     ,     
                                        ,        。      
    ;password=123               ;             ,        ,     SHA  
                                   :{SHA}82ab876d1387bfafe46cc1c8a2ef074eae50cb1d
                                       。。。     
    
    ;[inet_http_server]         ;    TCP  socket,Web Server    supervisorctl     
                                       ,      。     
    ;port=127.0.0.1:9001        ;       IP   ,    IP  :9001 *:9001。
                                        ,     [inet_http_server]   ,      
    ;username=user              ;       uinx_http_server   。     
    ;password=123               ;       。     
    
    [supervisord]                ;       supervisord             
                                        ,   ,supervisor      
    logfile=/tmp/supervisord.log ;    supervisord          ,            。
                                       $CWD/supervisord.log,$CWD     。。     
    logfile_maxbytes=50MB        ;                  ,   50M   ,         
                                      。    0 ,         
                                       50M,     。              
    logfile_backups=10           ;          ,         50M ,         。  
                                       10 ,            ,        10
                                       0 ,          。
                                         10。。。     
    loglevel=info                ;     , critical, error, warn, info, debug, trace, or blather 
                                      info。。。      
    pidfile=/tmp/supervisord.pid ; supervisord pid    。
                                      $CWD/supervisord.pid。。。     
    nodaemon=false               ;    true,supervisord        
                                      false,            。。。     
    minfds=1024                  ;                ,     supervisor     。
                                                cat /proc/sys/fs/file-max
                                         1024。。。     
    minprocs=200                 ;           ,     supervisor        。
                                  ulimit  -u    ,    linux          
                                     200。。。     
    ;umask=022                   ;          
                                      022。。      
    ;user=chrism                 ;            root  ,    root    supervisord  。
                                              ,    supervisord    
                                           。。。      
    ;identifier=supervisor       ;      supervisord    ,    XML_RPC  。     
                                   supervisor   ,     XML_RPC    ,      
                                   supervisor         
                                      supervisord。。。     
    ;directory=/tmp              ;       supervisord           ,        ,  
                                   supervisord    ,         
                                        。。。     
    ;nocleanup=true              ;       false   ,  supervisord       ,      
                                          (   AUTO    )   。            ,  
                                            。       true
                                      false,             true。。。     
    ;childlogdir=/tmp            ;          AUTO   ,            。
                                            ,            OK ,          
                                   python -c "import tempfile;print tempfile.gettempdir()"
                                        
    ;environment=KEY="value"     ;             ,supervisord linux        linux 
                                       ,       supervisord           。
                                   supervisord      ,                。      
                                                 。
                                      :environment=name="haha",age="hehe"
                                         。。。     
    ;strip_ansi=false            ;          true,            ANSI   。   ANSI
                                      ?     
    ,\t 。 false。。。 ; the below section must remain in the config file for RPC ; (supervisorctl/web interface) to work, additional interfaces may be ; added by defining them in separate rpcinterface: sections [rpcinterface:supervisor] ; XML_RPC , supervisord web server supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] ; supervisorctl serverurl=unix:///tmp/supervisor.sock ; supervisorctl supervisord , UNIX socket , [unix_http_server] unix:///tmp/supervisor.sock。。 ;serverurl=http://127.0.0.1:9001 ; supervisorctl supervisord , TCP socket [inet_http_server] http://127.0.0.1:9001。。。 ;username=chris ; 。。 ;password=123 ; 。。 ;prompt=mysupervisor ; supervisor。。 ;history_file=~/.sc_history ; shell history , no file 。。 , 。。。 ; The below sample program section shows all possible program subsection values, ; create one or more 'real' program: sections to be able to control them under ; supervisor. ;[program:theprogramname] ; ,":" , 。 program , program ;command=/bin/cat ; , :/home/test.py -a 'hehe' , command , 。 , command=service httpd start。 httpd linux service , supervisor 。 ;process_name=%(program_name)s ; , numprocs 1 , , %(program_name)s program , numprocs , 。 , 。 ;numprocs=1 ; 。 1 , , process_name 1 。。 ;directory=/tmp ; , 。。。 ;umask=022 ; , none, ;priority=999 ; , , , 999 。。 ;autostart=true ; true , supervisord true 。。 ;autorestart=unexpected ; , ,false,unexpected true。 false , , , unexpected, exitcodes , 。 true , , ;startsecs=1 ; , running, 1 。。 ;startretries=3 ; , 。。 3 ,supervisor FAIL 3 。。 ;exitcodes=0,2 ; autorestart=unexpected 。。exitcodes expected 。 ;stopsignal=QUIT ; , TERM, HUP, INT, QUIT, KILL, USR1, or USR2 TERM 。。 , expected ;stopwaitsecs=10 ; stopsignal , supervisord, 。 ,supervisord kill 。 10 。。 ;stopasgroup=false ; ,supervisord , 。 supervisord , 。 , 。 true , killasgroup true。 , stop false。。 。。 ;killasgroup=false ; stopasgroup , kill ;user=chrism ; supervisord root , root , program 。。。 ;redirect_stderr=true ; true, stderr stdout false, ;stdout_logfile=/a/path ; stdout , ,AUTO,none 。 none , 。 AUTO , , supervisord , 。 redirect_stderr=true ,sterr ;stdout_logfile_maxbytes=1MB ; , [supervisord] 。 50 ;stdout_logfile_backups=10 ; [supervisord] 。 10 ;stdout_capture_maxbytes=1MB ; capture , 0 , stdout , supervisor , event。 0, 0 。。。 ;stdout_events_enabled=false ; ture , stdout , supervisord PROCESS_LOG_STDOUT event false。。。 ;stderr_logfile=/a/path ; stderr , redirect_stderr=true。 , 。 stdout_logfile AUTO, ,supervisord 。。 ;stderr_logfile_maxbytes=1MB ; , ;stderr_logfile_backups=10 ; ;stderr_capture_maxbytes=1MB ; , stdout_capture 。 0, ;stderr_events_enabled=false ; , false ;environment=A="1",B="2" ; , ;serverurl=AUTO ; ; The below sample eventlistener section shows all possible ; eventlistener subsection values, create one or more 'real' ; eventlistener: sections to be able to handle event notifications ; sent by supervisor. ;[eventlistener:theeventlistenername] ; program , suopervisor , supervisord event。 listener 。 listener , , ;command=/bin/eventlistener ; program , listener ;process_name=%(program_name)s ; , , numprocs , 。 OK ;numprocs=1 ; listener ;events=EVENT ; event , , 。 ;buffer_size=10 ; event , , 。 buffer 10 , event , event 。 10。。 ;directory=/tmp ; , 。。。 ;umask=022 ; , none, ;priority=-1 ; , -1, ;autostart=true ; supervisord , true ;autorestart=unexpected ; , program , true,false,unexpected , unexpected exitcodes ;startsecs=1 ; , , , 1 ;startretries=3 ; , 3 ;exitcodes=0,2 ; , ;stopsignal=QUIT ; , TERM, QUIT, QUIT , expected ;stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10) ;stopasgroup=false ; send stop signal to the UNIX process group (default false) ;killasgroup=false ; SIGKILL the UNIX process group (def false) ;user=chrism ; , listener 。 。。 ;redirect_stderr=true ; true ,stderr log stdout log false。。。 ;stdout_logfile=/a/path ; , ;stdout_logfile_maxbytes=1MB ; ;stdout_logfile_backups=10 ; ;stdout_events_enabled=false ; ,listener event ;stderr_logfile=/a/path ; ;stderr_logfile_maxbytes=1MB ; ;stderr_logfile_backups ; ;stderr_events_enabled=false ; ,listener event ;environment=A="1",B="2" ; 。。。 ;serverurl=AUTO ; override serverurl computation (childutils) ; The below sample group section shows all possible group values, ; create one or more 'real' group: sections to create "heterogeneous" ; process groups. ;[group:thegroupname] ; programs , program。 。 :program , supervisor 。。。supervisor , program ;programs=progname1,progname2 ; , ;priority=999 ; , 999。。 ; The [include] section can just contain the "files" setting. This ; setting can list multiple files (separated by whitespace or ; newlines). It can also contain wildcards. The filenames are ; interpreted as relative to this file. Included files *cannot* ; include files themselves. ;[include] ; , , 。 , include ;files = relative/directory/*.ini

    OK、上記の必須設定項目ではなく、一般的にはデフォルト値があり、自分のニーズに合わせて設定することができます..設定しないとsupervisorも使えます
    プログラム構成
    supervisrodを実行しました.管理するプロセスのプロファイルを追加できます.すべての構成項目をsupervisordに書くことができます.confファイルには、推奨されませんが、includeで異なるプログラム(グループ)を異なるプロファイルに書きます.例を挙げるために、これらのプロファイルを格納するディレクトリ/etc/supervisor/を新規作成し、対応する/etc/supervisord.confのinclude部分の構成を変更します.
    [include]
    files = /etc/supervisor/*.conf
    

    PythonとFlaskフレームワークで作成されたユーザーセンターシステムがあると仮定し、usercenterと名付け、gunicorn(http://gunicorn.org/)をWebサーバにします.プロジェクトコードは/home/leon/projects/usercenterにあり、gunicornプロファイルはgunicornである.py,WSDI callableはwsgi.pyのappプロパティ.コマンドラインで直接起動する方法は、次のとおりです.
    cd  /home/leon/projects/usercenter
    gunicorn -c gunicorn.py wsgi:app
    

    このプロセスを管理するプロファイルを作成します(supervisordで管理する場合はgunicornのdaemonオプションをFalseに設定する必要があります):
    [program:usercenter]
    directory = /home/leon/projects/usercenter ;        
    command = gunicorn -c gunicorn.py wsgi:app  ;     ,                    
    autostart = true     ;   supervisord           
    startsecs = 5        ;    5         ,          
    autorestart = true   ;            
    startretries = 3     ;           ,    3
    user = leon          ;        
    redirect_stderr = true  ;   stderr      stdout,   false
    stdout_logfile_maxbytes = 20MB  ; stdout       ,   50MB
    stdout_logfile_backups = 20     ; stdout        
    ; stdout     ,                   ,          (supervisord          )
    stdout_logfile = /data/logs/usercenter_stdout.log
    ;      environment           ,           PYTHONPATH
    ; environment=PYTHONPATH=$PYTHONPATH:/path/to/somewhere
    

    1つのプロファイルには、supervisordにそのプロセスを管理する必要があることを示す少なくとも1つの[program:x]セクションの構成が必要です.[program:x]構文のxはprogram nameを表し、クライアント(supervisorctlまたはwebインタフェース)に表示され、supervisorctlではこの値でプログラムをstart、restart、stopなどの操作を行います.
    supervisorctlの使用
    Supervisorctlはsupervisordのコマンドラインクライアントツールで、起動時にsupervisordと同じプロファイルを使用するように指定する必要があります.そうしないと、supervisordと同じように順番にプロファイルを検索します.
    supervisorctl -c /etc/supervisord.conf
    

    このコマンドはsupervisorctlのshellインタフェースに入り、異なるコマンドを実行できます.
    $ supervisorctl status
    $ supervisorctl stop usercenter
    $ supervisorctl start usercenter
    $ supervisorctl restart usercenter
    $ supervisorctl reread
    $ supervisorctl update