Supervisor使用教程
linux kill 掉所有匹配到名字的進程
如,要 kill 掉 swoole 相關的進程
ps aux | grep swoole | awk ‘{print $2}’ | xargs kill -9
ps 列出所有進程,
參數:
a - 顯示現行終端機下的所有進程,包括其他用戶的進程;
u - 以用戶為主的進程狀態 ;
x - 通常與 a 這個參數一起使用,可列出較完整信息。
grep 過濾掉不包含 “swoole” 的行
awk ‘{print $2}’ 獲取進程 ID (PID, Process Identification),我們想 kill 掉某一個進程的時候需要通過 PID 指定特定進程
xargs 將標準輸入數據轉換成命令行參數,xargs能夠處理管道或者stdin并將其轉換成特定命令的命令參數。
也就是將管道傳遞過來的每一個 PID 作為 kill -9 的參數
<div><p>在項目中,經常有腳本需要常駐運行的需求。以PHP腳本為例,最簡單的方式是:</p><pre>$ nohup php cli.php &</pre><p>這樣能保證當前終端被關閉或者按CRTL+C后,腳本仍在后臺運行。但是沒法保證腳本異常后自動重啟等。</p><p>Supervisor 是用Python開發的一套通用的進程管理程序,能將一個普通的命令行進程變為后臺daemon,并監控進程狀態,異常退出時能自動重啟。</p><p>官網介紹:<a href="http://supervisord.org/">http://supervisord.org/</a></p><p>本文所用環境:</p><ul class="list-paddingleft-2"><li><p>CentOS release 6.8 (Final)</p></li><li><p>Python 2.6.6</p></li><li><p>pip 7.1.0 from /usr/lib/python2.6/site-packages (python 2.6)</p></li><li><p>supervisor 3.3.4</p></li></ul><h2>安裝</h2><h3>平臺要求</h3><p>引自官網(<a href="http://supervisord.org/introduction.html#platform-requirements">http://supervisord.org/introduction.html#platform-requirements</a>):</p><blockquote><p>Supervisor已經過測試,可以在Linux(Ubuntu 9.10),Mac OS X(10.4 / 10.5 / 10.6)和Solaris(10 for Intel)和FreeBSD 6.1上運行。它可能在大多數UNIX系統上都能正常工作。在任何版本的Windows下,Supervisor 都不會運行。Supervisor 可以使用<code>Python 2.4</code>或更高版本,但不能在任何版本的<code>Python 3</code>下使用。</p></blockquote><p>我使用的環境:</p><pre>$ python -VPython?2.6.6
安裝
安裝方法有:
1、easy_install 安裝(需安裝有pip):
3、Debian / Ubuntu可以直接通過apt安裝:
KaTeX parse error: Expected 'EOF', got '&' at position 1: &?nbsp;apt-get&nb…?mkdir?/etc/supervisorKaTeX parse error: Expected 'EOF', got '&' at position 1: &?nbsp;echo_super…?supervisord
即可運行。
supervisor 默認在以下路徑查找配置文件:/usr/etc/supervisord.conf, /usr/supervisord.conf, supervisord.conf, etc/supervisord.conf, /etc/supervisord.conf, /etc/supervisor/supervisord.conf
如需指定主配置文件,則需要使用-c參數:
KaTeX parse error: Expected 'EOF', got '&' at position 1: &?nbsp;supervisor…?supervisord?-v3.3.4
然后查看supervisor的狀態:
KaTeX parse error: Expected 'EOF', got '&' at position 1: &?nbsp;supervisor…?/etc/init.d/supervisor?start運行。
使用示例
我們以簡單的 /tmp/echo_time.sh 為例:
#/bin/bashwhile?true;?doecho?date +%Y-%m-%d,%H:%m:%s
sleep?2done
在/etc/supervisor/conf.d/新增子進程配置文件 echo_time.conf:
[program:echo_time]command=sh?/tmp/echo_time.shpriority=999????????????????;?the?relative?start?priority?(default?999)autostart=true??????????????;?start?at?supervisord?start?(default:?true)autorestart=true????????????;?retstart?at?unexpected?quit?(default:?true)startsecs=10????????????????;?number?of?secs?prog?must?stay?running?(def.?10)startretries=3??????????????;?max?#?of?serial?start?failures?(default?3)exitcodes=0,2???????????????;?‘expected’?exit?codes?for?process?(default?0,2)stopsignal=QUIT?????????????;?signal?used?to?kill?process?(default?TERM)stopwaitsecs=10?????????????;?max?num?secs?to?wait?before?SIGKILL?(default?10)user=root?????????????????;?setuid?to?this?UNIX?account?to?run?the?programlog_stdout=truelog_stderr=true?????????????;?if?true,?log?program?stderr?(def?false)logfile=/tmp/echo_time.loglogfile_maxbytes=1MB????????;?max?#?logfile?bytes?b4?rotation?(default?50MB)logfile_backups=10??????????;?#?of?logfile?backups?(default?10)stdout_logfile_maxbytes=20MB??;?stdout?日志文件大小,默認?50MBstdout_logfile_backups=20?????;?stdout?日志文件備份數stdout_logfile=/tmp/echo_time.stdout.log然后啟動程序:
$?supervisorctl?rereadKaTeX parse error: Expected 'EOF', got '&' at position 1: &?nbsp;supervisor…?tail?-f?/tmp/echo_time.stdout.log
2018-12-22,14:12:1545459550
2018-12-22,14:12:1545459552
2018-12-22,14:12:1545459554
也可以使用supervisorctl status查看子進程運行情況:
$?supervisorctl??statusecho_time????????????????????????RUNNING???pid?28206,?uptime?0:00:11
配置文件
主配置
主配置文件名: supervisord.conf
可以通過運行echo_supervisord_conf獲得。這個配置文件一般情況下不需要更改,除了最后的[include]部分,其余保持默認即可。
[unix_http_server]file=/tmp/supervisor.sock???;?the?path?to?the?socket?file;chmod=0700?????????????????;?socket?file?mode?(default?0700);chown=nobody:nogroup???????;?socket?file?uid:gid?owner
;username=user??????????????;?default?is?no?username?(open?server)
;password=123???????????????;?default?is?no?password?(open?server)
;[inet_http_server]?????????;?配置web后臺
;port=127.0.0.1:9001????????;?指定ip_address:port,?使用?*:port?監聽所有?IP
;username=user??????????????;?默認沒有用戶名?(open?server)
;password=123???????????????;?默認沒有密碼?(open?server)
[supervisord]
logfile=/tmp/supervisord.log?;?日志文件;?默認?KaTeX parse error: Expected 'EOF', got '&' at position 42: …e_maxbytes=50MB&?nbsp; &nbs…TEMP
;environment=KEY=“value”?????;?key?value?pairs?to?add?to?environment
;strip_ansi=false????????????;?strip?ansi?escape?codes?in?logs;?def.?false;?The?rpcinterface:supervisor?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:x]?sections.
[rpcinterface:supervisor]
supervisor.rpcinterface_factory?=?supervisor.rpcinterface:make_main_rpcinterface
;?配置?supervisorctl?
;?configure?it?match?the?settings?in?either?the?unix_http_server
;?or?inet_http_server?section.
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock?;?use?a?unix://?URL??for?a?unix?socket
;serverurl=http://127.0.0.1:9001?;?use?an?http://?url?to?specify?an?inet?socket
;username=chris??????????????;?should?be?same?as?in?[_http_server]?if?set
;password=123????????????????;?should?be?same?as?in?[_http_server]?if?set
;prompt=mysupervisor?????????;?cmd?line?prompt?(default?“supervisor”)
;history_file=~/.sc_history??;?use?readline?history?if?available
;?下面是子進程配置文件示例
;?Create?one?or?more?‘real’?program:?sections?to?be?able?to?control?them?under
;?supervisor.
;[program:theprogramname]
;command=/bin/cat??????????????;?the?program?(relative?uses?PATH,?can?take?args)
;process_name=%(program_name)s?;?process_name?expr?(default?%(program_name)s)
;numprocs=1????????????????????;?number?of?processes?copies?to?start?(def?1)
;directory=/tmp????????????????;?directory?to?cwd?to?before?exec?(def?no?cwd)
;umask=022?????????????????????;?umask?for?process?(default?None)
;priority=999??????????????????;?the?relative?start?priority?(default?999)
;autostart=true????????????????;?start?at?supervisord?start?(default:?true)
;startsecs=1???????????????????;?#?of?secs?prog?must?stay?up?to?be?running?(def.?1)
;startretries=3????????????????;?max?#?of?serial?start?failures?when?starting?(default?3)
;autorestart=unexpected????????;?when?to?restart?if?exited?after?running?(def:?unexpected)
;exitcodes=0,2?????????????????;?‘expected’?exit?codes?used?with?autorestart?(default?0,2)
;stopsignal=QUIT???????????????;?signal?used?to?kill?process?(default?TERM)
;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???????????????????;?setuid?to?this?UNIX?account?to?run?the?program
;redirect_stderr=true??????????;?redirect?proc?stderr?to?stdout?(default?false)
;stdout_logfile=/a/path????????;?stdout?log?path,?NONE?for?none;?default?AUTO
;stdout_logfile_maxbytes=1MB???;?max?#?logfile?bytes?b4?rotation?(default?50MB)
;stdout_logfile_backups=10?????;?#?of?stdout?logfile?backups?(0?means?none,?default?10)
;stdout_capture_maxbytes=1MB???;?number?of?bytes?in?‘capturemode’?(default?0)
;stdout_events_enabled=false???;?emit?events?on?stdout?writes?(default?false)
;stderr_logfile=/a/path????????;?stderr?log?path,?NONE?for?none;?default?AUTO
;stderr_logfile_maxbytes=1MB???;?max?#?logfile?bytes?b4?rotation?(default?50MB)
;stderr_logfile_backups=10?????;?#?of?stderr?logfile?backups?(0?means?none,?default?10)
;stderr_capture_maxbytes=1MB???;?number?of?bytes?in?‘capturemode’?(default?0)
;stderr_events_enabled=false???;?emit?events?on?stderr?writes?(default?false)
;environment=A=“1”,B=“2”???????;?process?environment?additions?(def?no?adds)
;serverurl=AUTO????????????????;?override?serverurl?computation?(childutils)
;?The?sample?eventlistener?section?below?shows?all?possible?eventlistener
;?subsection?values.??Create?one?or?more?‘real’?eventlistener:?sections?to?be
;?able?to?handle?event?notifications?sent?by?supervisord.
;[eventlistener:theeventlistenername]
;command=/bin/eventlistener????;?the?program?(relative?uses?PATH,?can?take?args)
;process_name=%(program_name)s?;?process_name?expr?(default?%(program_name)s)
;numprocs=1????????????????????;?number?of?processes?copies?to?start?(def?1)
;events=EVENT??????????????????;?event?notif.?types?to?subscribe?to?(req’d)
;buffer_size=10????????????????;?event?buffer?queue?size?(default?10)
;directory=/tmp????????????????;?directory?to?cwd?to?before?exec?(def?no?cwd)
;umask=022?????????????????????;?umask?for?process?(default?None)
;priority=-1???????????????????;?the?relative?start?priority?(default?-1)
;autostart=true????????????????;?start?at?supervisord?start?(default:?true)
;startsecs=1???????????????????;?#?of?secs?prog?must?stay?up?to?be?running?(def.?1)
;startretries=3????????????????;?max?#?of?serial?start?failures?when?starting?(default?3)
;autorestart=unexpected????????;?autorestart?if?exited?after?running?(def:?unexpected)
;exitcodes=0,2?????????????????;?‘expected’?exit?codes?used?with?autorestart?(default?0,2)
;stopsignal=QUIT???????????????;?signal?used?to?kill?process?(default?TERM)
;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???????????????????;?setuid?to?this?UNIX?account?to?run?the?program
;redirect_stderr=false?????????;?redirect_stderr=true?is?not?allowed?for?eventlisteners
;stdout_logfile=/a/path????????;?stdout?log?path,?NONE?for?none;?default?AUTO
;stdout_logfile_maxbytes=1MB???;?max?#?logfile?bytes?b4?rotation?(default?50MB)
;stdout_logfile_backups=10?????;?#?of?stdout?logfile?backups?(0?means?none,?default?10)
;stdout_events_enabled=false???;?emit?events?on?stdout?writes?(default?false)
;stderr_logfile=/a/path????????;?stderr?log?path,?NONE?for?none;?default?AUTO
;stderr_logfile_maxbytes=1MB???;?max?#?logfile?bytes?b4?rotation?(default?50MB)
;stderr_logfile_backups=10?????;?#?of?stderr?logfile?backups?(0?means?none,?default?10)
;stderr_events_enabled=false???;?emit?events?on?stderr?writes?(default?false)
;environment=A=“1”,B=“2”???????;?process?environment?additions
;serverurl=AUTO????????????????;?override?serverurl?computation?(childutils)
;?The?sample?group?section?below?shows?all?possible?group?values.??Create?one
;?or?more?‘real’?group:?sections?to?create?“heterogeneous”?process?groups.
;[group:thegroupname]
;programs=progname1,progname2??;?each?refers?to?‘x’?in?[program:x]?definitions
;priority=999??????????????????;?the?relative?start?priority?(default?999)
;?配置include?files
;?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]??
;?.ini和.conf都支持
files?=?relative/directory/*.ini
子進程配置文件
一般放在:/etc/supervisor/conf.d/目錄 。一個腳本對應一個配置文件。
配置說明:
;為必須填寫項;[program:應用名稱][program:cat];*命令路徑,如果使用python啟動的程序應該為?python?/home/test.py,?;不建議放入/home/user/,?對于非user用戶一般情況下是不能訪問command=/bin/cat;當numprocs為1時,process_name=%(program_name)s;當numprocs>=2時,%(program_name)s_%(process_num)02dprocess_name=%(program_name)s;進程數量numprocs=1;執行目錄,若有/home/supervisor_test/test1.py;將directory設置成/home/supervisor_test;則command只需設置成python?test1.py;否則command必須設置成絕對執行目錄directory=/tmp;掩碼:—?-w-?-w-,?轉換后rwx?r-x?w-xumask=022;優先級,值越高,最后啟動,最先被關閉,默認值999priority=999;如果是true,當supervisor啟動時,程序將會自動啟動autostart=true;*自動重啟autorestart=true;啟動延時執行,默認1秒startsecs=10;啟動嘗試次數,默認3次startretries=3;當退出碼是0,2時,執行重啟,默認值0,2exitcodes=0,2;停止信號,默認TERM;中斷:INT(類似于Ctrl+C)(kill?-INT?pid),退出后會將寫文件或日志(推薦);終止:TERM(kill?-TERM?pid);掛起:HUP(kill?-HUP?pid),注意與Ctrl+Z/kill?-stop?pid不同;從容停止:QUIT(kill?-QUIT?pid);KILL,?USR1,?USR2其他見命令(kill?-l),說明1stopsignal=TERMstopwaitsecs=10;*以root用戶執行user=root;重定向redirect_stderr=falsestdout_logfile=/a/pathstdout_logfile_maxbytes=1MBstdout_logfile_backups=10stdout_capture_maxbytes=1MBstderr_logfile=/a/pathstderr_logfile_maxbytes=1MBstderr_logfile_backups=10stderr_capture_maxbytes=1MB;環境變量設置environment=A=“1”,B="2"serverurl=AUTO簡化模板
[program:echo_time]command=sh?/tmp/echo_time.shautostart=trueautorestart=truestartsecs=10startretries=3?exitcodes=0,2stopsignal=QUITstopwaitsecs=10user=rootlog_stdout=truelog_stderr=truelogfile=/tmp/echo_time.loglogfile_maxbytes=1MBlogfile_backups=10?stdout_logfile_maxbytes=20MB?stdout_logfile_backups=20?stdout_logfile=/tmp/echo_time.stdout.log
命令行程序
supervisord
supervisord 是主進程。
通過supervisord -h可以查看幫助說明。示例:
-c/–configuration?FILENAME?;指定配置文件-n/–nodaemon?;運行在前臺(調試用)-v/–version?;打印版本信息-u/–user?USER?;以指定用戶(或用戶ID)運行-m/–umask?UMASK?;指定子進程的umask,默認是022-l/–logfile?FILENAME?;指定日志文件-e/–loglevel?LEVEL?;指定日志級別supervisorctl
supervisorctl 是客戶端程序,用于向supervisord發起命令。
通過supervisorctl -h可以查看幫助說明。我們主要關心的是其action命令:
$?supervisorctl??helpdefault?commands?(type?help?<topic>):add????exit??????open??reload??restart???start???tail???
avail??fg????????pid???remove??shutdown??status??update?
clear??maintail??quit??reread??signal????stop????version
這些命令對于控制子進程非常重要。示例:
reread?;重新加載配置文件update?;將配置文件里新增的子進程加入進程組,如果設置了autostart=true則會啟動新新增的子進程
status?;查看所有進程狀態
status?<name>?;查看指定進程狀態
start?all;?啟動所有子進程
start?<name>;?啟動指定子進程
restart?all;?重啟所有子進程
restart?<name>;?重啟指定子進程
stop?all;?停止所有子進程
stop?<name>;?停止指定子進程
reload?;重啟supervisord
add?<name>;?添加子進程到進程組
reomve?<name>;?從進程組移除子進程,需要先stop。注意:移除后,需要使用reread和update才能重新運行該進程
supervisord 有進程組(process group)的概念:只有子進程在進程組,才能被運行。
supervisorctl也支持交互式命令行:
KaTeX parse error: Expected 'EOF', got '&' at position 1: &?nbsp;supervisor…?supervisorctl?reload瀏覽器訪問:http://myip:9001 ,輸入用戶名、密碼后,即可看到web頁面:
注意:如果修改配置文件時,[inet_http_server]這一行被注釋,會導致不僅web需要認證,命令行使用supervisorctl也需要認證,這時候就需要在交互式命令行里輸入用戶名、密碼才能進行下一步的操作。
其它問題
1、Centos6 docker環境沒有pip
解決方案:需要先安裝擴展源EPEL。
EPEL(http://fedoraproject.org/wiki/EPEL) 是由 Fedora 社區打造,為 RHEL 及衍生發行版如 CentOS、Scientific Linux 等提供高質量軟件包的項目。
首先安裝epel擴展源:
KaTeX parse error: Expected 'EOF', got '&' at position 1: &?nbsp;yum -…?yum?-y?install?python-pip查看版本:
KaTeX parse error: Expected 'EOF', got '&' at position 1: &?nbsp;pip -…?supervisor?-V出現:
Traceback?(most?recent?call?last):??File?“/usr/bin/echo_supervisord_conf”,?line?5,?in?<module>????from?pkg_resources?import?load_entry_point??File?“/usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg/pkg_resources.py”,?line?2603,?in?<module>??File?“/usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg/pkg_resources.py”,?line?666,?in?require??File?“/usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg/pkg_resources.py”,?line?565,?in?resolvepkg_resources.DistributionNotFound:?meld3>=0.6.5
原因:pip安裝的meld3不可用,手動安裝。
wget?https://pypi.python.org/packages/source/m/meld3/meld3-1.0.2.tar.gztar?-zxf?meld3-1.0.2.tar.gzcd?meld3-1.0.2
python?setup.py?install
感謝https://www.cnblogs.com/hubery/p/5653007.html 文章提供的方法!這個問題困擾了好久,github頁面(https://github.com/Supervisor/meld3/issues/23)提供的解決方案都不可行,反而導致pip都不能用了。
3、因參考github里meld3解決方案導致pip不可用:
Traceback?(most?recent?call?last):??File?“/usr/bin/pip”,?line?5,?in?<module>????from?pkg_resources?import?load_entry_point??File?“/usr/lib/python2.6/site-packages/pkg_resources/init.py”,?line?957,?in?<module>????class?Environment:??File?“/usr/lib/python2.6/site-packages/pkg_resources/init.py”,?line?961,?in?Environment????self,?search_path=None,?platform=get_supported_platform(),??File?“/usr/lib/python2.6/site-packages/pkg_resources/init.py”,?line?188,?in?get_supported_platformplat?=?get_build_platform()??File?“/usr/lib/python2.6/site-packages/pkg_resources/init.py”,?line?391,?in?get_build_platform????from?sysconfig?import?get_platform
ImportError:?No?module?named?sysconfig
解決方案:刪除/site-packages下面的包,重新安裝python-setuptools:
rm?-rf?/usr/lib/python2.6/site-packages/pkg_resources*yum?reinstall?python-setuptools
參考:https://stackoverflow.com/questions/50742538/importerror-no-module-named-sysconfig-cant-get-pip-working
參考
1、Supervisor: A Process Control System — Supervisor 3.3.4 documentation
http://supervisord.org/index.html
2、進程管理supervisor的簡單說明 - jyzhou - 博客園
https://www.cnblogs.com/zhoujinyi/p/6073705.html
3、DevOps
https://mp.weixin.qq.com/s/mqrkAEaGFKJy-4PQadJJ9w?
4、supervisor使用 - 回首鄭板橋 - 博客園
https://www.cnblogs.com/hubery/p/5653007.html
原文出處:https://www.cnblogs.com/52fhy/p/10161253.html ?
點擊查看更多內容
PHP
1人點贊
若覺得本文不錯,就分享一下吧!
總結
以上是生活随笔為你收集整理的Supervisor使用教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php进程学习(一)
- 下一篇: 从已有安装包(vendor)恢复 com