一篇带你了解CentOS 安装Supervisor
<p><img style="max-width:100%!important;height:auto!important;"title="一篇带你了解CentOS 安装Supervisor" alt="一篇带你了解CentOS 安装Supervisor" border="0" src="https://zhuji.jb51.net/uploads/img/202305/d366d2fed721f895ff3a32e14cf45a4d.jpg"></p>
<h3>
简介
</h3>
<p>
CentOS有自带的supervisor,可以通过yum直接安装。
</p>
<h3>
安装
</h3>
<p>
在CentOS7上可以直接安装,在CentOS Stream上可以通过epel-release安装。
</p>
<ol class="dp-sql">
<li class="alt">
<span><span>yum-yinstallsupervisor</span></span>
</li>
</ol>
<h3>
服务
</h3>
<p>
CentOS7以上的版本都是使用systemd进行服务管理
</p>
<ol class="dp-sql">
<li class="alt">
<span><span>systemctlenablesupervisord</span></span>
</li>
<li>
<span>systemctlstartsupervisord</span>
</li>
</ol>
<h3>
配置
</h3>
<p>
默认配置文件是/etc/supervisord.conf
</p>
<ol class="dp-sql">
<li class="alt">
<span><span></span></span>
</li>
<li>
<span>file=/run/supervisor/supervisor.sock;(thepath<span class="keyword">to</span><span>thesocketfile)</span></span>
</li>
<li class="alt">
<span></span>
</li>
<li>
<span></span>
</li>
<li class="alt">
<span>logfile=/var/log/supervisor/supervisord.log;(mainlogfile;<span class="keyword">default</span><span>$CWD/supervisord.log)</span></span>
</li>
<li>
<span>logfile_maxbytes=50MB;(<span class="keyword">max</span><span>mainlogfilebytesb4rotation;</span><span class="keyword">default</span><span>50MB)</span></span>
</li>
<li class="alt">
<span>logfile_backups=10;(num<span class="keyword">of</span><span>mainlogfilerotationbackups;</span><span class="keyword">default</span><span>10)</span></span>
</li>
<li>
<span>loglevel=info;(log<span class="keyword">level</span><span>;</span><span class="keyword">default</span><span>info;others:debug,warn,trace)</span></span>
</li>
<li class="alt">
<span>pidfile=/run/supervisord.pid;(supervisordpidfile;<span class="keyword">default</span><span>supervisord.pid)</span></span>
</li>
<li>
<span>nodaemon=<span class="keyword">false</span><span>;(start</span><span class="op">in</span><span>foregroundif</span><span class="keyword">true</span><span>;</span><span class="keyword">default</span><span></span><span class="keyword">false</span><span>)</span></span>
</li>
<li class="alt">
<span>minfds=1024;(<span class="keyword">min</span><span>.availstartupfiledescriptors;</span><span class="keyword">default</span><span>1024)</span></span>
</li>
<li>
<span>minprocs=200;(<span class="keyword">min</span><span>.availprocessdescriptors;</span><span class="keyword">default</span><span>200)</span></span>
</li>
<li class="alt">
<span></span>
</li>
<li>
<span></span>
</li>
<li class="alt">
<span>supervisor.rpcinterface_factory=supervisor.rpcinterface:make_main_rpcinterface</span>
</li>
<li>
<span></span>
</li>
<li class="alt">
<span></span>
</li>
<li>
<span>serverurl=unix:///run/supervisor/supervisor.sock;useaunix://URL<span class="keyword">for</span><span>aunixsocket</span></span>
</li>
<li class="alt">
<span></span>
</li>
<li>
<span></span>
</li>
<li class="alt">
<span>files=supervisord.d/*.ini</span>
</li>
<li>
<span>#cat/etc/supervisord.conf|grep-v<span class="string">'^;'</span><span>|grep-v</span><span class="string">'^$'</span><span></span></span>
</li>
<li class="alt">
<span></span>
</li>
<li>
<span>file=/run/supervisor/supervisor.sock;(thepath<span class="keyword">to</span><span>thesocketfile)</span></span>
</li>
<li class="alt">
<span></span>
</li>
<li>
<span>logfile=/var/log/supervisor/supervisord.log;(mainlogfile;<span class="keyword">default</span><span>$CWD/supervisord.log)</span></span>
</li>
<li class="alt">
<span>logfile_maxbytes=50MB;(<span class="keyword">max</span><span>mainlogfilebytesb4rotation;</span><span class="keyword">default</span><span>50MB)</span></span>
</li>
<li>
<span>logfile_backups=10;(num<span class="keyword">of</span><span>mainlogfilerotationbackups;</span><span class="keyword">default</span><span>10)</span></span>
</li>
<li class="alt">
<span>loglevel=info;(log<span class="keyword">level</span><span>;</span><span class="keyword">default</span><span>info;others:debug,warn,trace)</span></span>
</li>
<li>
<span>pidfile=/run/supervisord.pid;(supervisordpidfile;<span class="keyword">default</span><span>supervisord.pid)</span></span>
</li>
<li class="alt">
<span>nodaemon=<span class="keyword">false</span><span>;(start</span><span class="op">in</span><span>foregroundif</span><span class="keyword">true</span><span>;</span><span class="keyword">default</span><span></span><span class="keyword">false</span><span>)</span></span>
</li>
<li>
<span>minfds=1024;(<span class="keyword">min</span><span>.availstartupfiledescriptors;</span><span class="keyword">default</span><span>1024)</span></span>
</li>
<li class="alt">
<span>minprocs=200;(<span class="keyword">min</span><span>.availprocessdescriptors;</span><span class="keyword">default</span><span>200)</span></span>
</li>
<li>
<span></span>
</li>
<li class="alt">
<span>supervisor.rpcinterface_factory=supervisor.rpcinterface:make_main_rpcinterface</span>
</li>
<li>
<span></span>
</li>
<li class="alt">
<span>serverurl=unix:///run/supervisor/supervisor.sock;useaunix://URL<span class="keyword">for</span><span>aunixsocket</span></span>
</li>
<li>
<span></span>
</li>
<li class="alt">
<span>files=supervisord.d/*.ini</span>
</li>
</ol>
<p>
可以直接修改这个配置直接加promgram管理程序
</p>
<p>
也可以放到/etc/supervisord.d/*.ini这个目录里面,独立文件方便拷贝管理。
</p>
<ol class="dp-sql">
<li class="alt">
<span><span>vim/etc/supervisord.d/demo.ini</span></span>
</li>
</ol>
<ol class="dp-sql">
<li class="alt">
<span><span></span></span>
</li>
<li>
<span>command=/usr/<span class="keyword">local</span><span>/demo/demo;theprogram(</span><span class="keyword">relative</span><span>usesPATH,cantakeargs)</span></span>
</li>
<li class="alt">
<span>;process_name=%(program_name)s;process_nameexpr(<span class="keyword">default</span><span>%(program_name)s)</span></span>
</li>
<li>
<span>;numprocs=1;number<span class="keyword">of</span><span>processescopies</span><span class="keyword">to</span><span>start(def1)</span></span>
</li>
<li class="alt">
<span>directory=/usr/<span class="keyword">local</span><span>/demo;directory</span><span class="keyword">to</span><span>cwd</span><span class="keyword">to</span><span>before</span><span class="keyword">exec</span><span>(def</span><span class="keyword">no</span><span>cwd)</span></span>
</li>
<li>
<span>;umask=022;umask<span class="keyword">for</span><span>process(</span><span class="keyword">default</span><span>None)</span></span>
</li>
<li class="alt">
<span>;priority=999;the<span class="keyword">relative</span><span>startpriority(</span><span class="keyword">default</span><span>999)</span></span>
</li>
<li>
<span>;autostart=<span class="keyword">true</span><span>;start</span><span class="keyword">at</span><span>supervisordstart(</span><span class="keyword">default</span><span>:</span><span class="keyword">true</span><span>)</span></span>
</li>
<li class="alt">
<span>;autorestart=<span class="keyword">true</span><span>;retstart</span><span class="keyword">at</span><span>unexpectedquit(</span><span class="keyword">default</span><span>:</span><span class="keyword">true</span><span>)</span></span>
</li>
<li>
<span>;startsecs=10;number<span class="keyword">of</span><span>secsprogmuststayrunning(def.1)</span></span>
</li>
<li class="alt">
<span>;startretries=3;<span class="keyword">max</span><span>#</span><span class="keyword">of</span><span>serialstartfailures(</span><span class="keyword">default</span><span>3)</span></span>
</li>
<li>
<span>;exitcodes=0,2;<span class="string">'expected'</span><span>exitcodes</span><span class="keyword">for</span><span>process(</span><span class="keyword">default</span><span>0,2)</span></span>
</li>
<li class="alt">
<span>;stopsignal=QUIT;signalused<span class="keyword">to</span><span>killprocess(</span><span class="keyword">default</span><span>TERM)</span></span>
</li>
<li>
<span>;stopwaitsecs=10;<span class="keyword">max</span><span>numsecs</span><span class="keyword">to</span><span>waitb4SIGKILL(</span><span class="keyword">default</span><span>10)</span></span>
</li>
<li class="alt">
<span>;<span class="func">user</span><span>=chrism;setuid</span><span class="keyword">to</span><span>thisUNIXaccount</span><span class="keyword">to</span><span>runtheprogram</span></span>
</li>
<li>
<span>;redirect_stderr=<span class="keyword">true</span><span>;redirectprocstderr</span><span class="keyword">to</span><span>stdout(</span><span class="keyword">default</span><span></span><span class="keyword">false</span><span>)</span></span>
</li>
<li class="alt">
<span>;stdout_logfile=/a/path;stdoutlogpath,NONE<span class="keyword">for</span><span>none;</span><span class="keyword">default</span><span>AUTO</span></span>
</li>
<li>
<span>;stdout_logfile_maxbytes=1MB;<span class="keyword">max</span><span>#logfilebytesb4rotation(</span><span class="keyword">default</span><span>50MB)</span></span>
</li>
<li class="alt">
<span>;stdout_logfile_backups=10;#<span class="keyword">of</span><span>stdoutlogfilebackups(</span><span class="keyword">default</span><span>10)</span></span>
</li>
<li>
<span>;stdout_capture_maxbytes=1MB;number<span class="keyword">of</span><span>bytes</span><span class="op">in</span><span></span><span class="string">'capturemode'</span><span>(</span><span class="keyword">default</span><span>0)</span></span>
</li>
<li class="alt">
<span>;stdout_events_enabled=<span class="keyword">false</span><span>;emitevents</span><span class="keyword">on</span><span>stdoutwrites(</span><span class="keyword">default</span><span></span><span class="keyword">false</span><span>)</span></span>
</li>
<li>
<span>;stderr_logfile=/a/path;stderrlogpath,NONE<span class="keyword">for</span><span>none;</span><span class="keyword">default</span><span>AUTO</span></span>
</li>
<li class="alt">
<span>;stderr_logfile_maxbytes=1MB;<span class="keyword">max</span><span>#logfilebytesb4rotation(</span><span class="keyword">default</span><span>50MB)</span></span>
</li>
<li>
<span>;stderr_logfile_backups=10;#<span class="keyword">of</span><span>stderrlogfilebackups(</span><span class="keyword">default</span><span>10)</span></span>
</li>
<li class="alt">
<span>;stderr_capture_maxbytes=1MB;number<span class="keyword">of</span><span>bytes</span><span class="op">in</span><span></span><span class="string">'capturemode'</span><span>(</span><span class="keyword">default</span><span>0)</span></span>
</li>
<li>
<span>;stderr_events_enabled=<span class="keyword">false</span><span>;emitevents</span><span class="keyword">on</span><span>stderrwrites(</span><span class="keyword">default</span><span></span><span class="keyword">false</span><span>)</span></span>
</li>
<li class="alt">
<span>;environment=A=1,B=2;processenvironmentadditions(def<span class="keyword">no</span><span>adds)</span></span>
</li>
<li>
<span>;serverurl=AUTO;overrideserverurlcomputation(childutils)</span>
</li>
</ol>
<p>
配置好程序路径就可以加载到任务了。
</p>
<h3>
任务管理
</h3>
<p>
可以通过supervisorctl进行任务控制
</p>
<ol class="dp-sql">
<li class="alt">
<span><span>supervisorctlstatus#查看进程运行状态</span></span>
</li>
<li>
<span>supervisorctlstart进程名#启动进程</span>
</li>
<li class="alt">
<span>supervisorctlstop进程名#关闭进程</span>
</li>
<li>
<span>supervisorctlrestart进程名#重启进程</span>
</li>
<li class="alt">
<span>supervisorctlshutdown#关闭supervisord</span>
</li>
<li>
<span>supervisorctlreread#重新载入配置文件</span>
</li>
<li class="alt">
<span>supervisorctlreload#重新载入配置并重启</span>
</li>
</ol>
<h3>
句柄不够
</h3>
<p>
在一些高并发的程序可能出现句柄不够用的情况,可以通过编辑supervisord.service文件修改句柄数。
</p>
<ol class="dp-sql">
<li class="alt">
<span><span>vim/usr/lib/systemd/system/supervisord.service</span></span>
</li>
</ol>
<ol class="dp-sql">
<li class="alt">
<span><span></span></span>
</li>
<li>
<span>Description=ProcessMonitoring<span class="op">and</span><span>ControlDaemon</span></span>
</li>
<li class="alt">
<span><span class="keyword">After</span><span>=rc-</span><span class="keyword">local</span><span>.service</span></span>
</li>
<li>
<span></span>
</li>
<li class="alt">
<span></span>
</li>
<li>
<span>LimitNOFILE=40960</span>
</li>
<li class="alt">
<span>LimitNPROC=40960</span>
</li>
<li>
<span>Type=forking</span>
</li>
<li class="alt">
<span>ExecStart=/usr/bin/supervisord-c/etc/supervisord.conf</span>
</li>
<li>
<span>RuntimeDirectory=supervisor</span>
</li>
<li class="alt">
<span>RuntimeDirectoryMode=755</span>
</li>
<li>
<span></span>
</li>
<li class="alt">
<span></span>
</li>
<li>
<span>WantedBy=multi-<span class="func">user</span><span>.target</span></span>
</li>
</ol>
<p>
修改之后需要重启服务生效
</p>
<ol class="dp-sql">
<li class="alt">
<span><span>systemctldaemon-reload</span></span>
</li>
<li>
<span>systemctlrestartsupervisord</span>
</li>
</ol>
<h3>
总结
</h3>
<p>
使用supervisor可以让我们快速管理服务,特别是部署Go程序的时候很方便。
</p>
<p>
原文链接:https://www.toutiao.com/a7023028614039994892/
</p>
頁:
[1]