Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

使用Supervisor守护python进程

855 Aufrufe

Veröffentlicht am

Supervisor

Veröffentlicht in: Technologie
  • Als Erste(r) kommentieren

使用Supervisor守护python进程

  1. 1. 使用 Supervisor 守护 Python 进程 Author:guosong@staff.sina.com.cn 1、需求 现在有一个进程需要每时每刻不断的跑,但是这个进程又有可能由于各种原因有可能中断。当进 程中断的时候我希望能自动重新启动它,此时,就需要使用到了 Supervisor。Supervisor 起 到守护进程的作用。 2、安装 https://pypi.python.org/pypi/supervisor tar zxvf supervisor-3.0.tar.gz cd supervisor-3.0 python2.7 setup.py build python2.7 setup.py install 需要依赖于 meld3-1.0.0.tar.gz,联网安装,由于所在机器无法上网,故进行手动安装 meld。 参照上面方法再进行安装 meld,安装完成之后再次进行 install 即可。 测试安装是否成功:echo_supervisord_conf 配置文件:echo_supervisord_conf > /etc/supervisord.conf 3、Supervisor 相关 supervisord : supervisor 的服务器端部分,启动 supervisor 就是运行这个命令 supervisorctl:启动 supervisor 的命令行窗口 4、Demo1 测试
  2. 2. 需求是对本地的 API 进程进行守护,要求这个服务能在意外停止后自动重启。 API 的执行命令为:python2.6 /data1/guosong/mysqlapi/main/api_main.py --port=8005 修改配置文件: [program:mysqlapi] command = python2.6 /data1/guosong/mysqlapi/main/api_main.py --port=8005 autostart = true autorestart = true startsecs = 3 stdout_logfile = /data1/guosong/mysqlapi/log/mysqlapi_demo1.log 启动 supervisord: [root@typhoeus79 mysqlapi]# ps aux |grep super root 15377 0.0 0.0 61268 788 pts/3 R+ 16:23 0:00 grep super [root@typhoeus79 mysqlapi]# supervisord Unlinking stale socket /var/tmp/supervisor.sock [root@typhoeus79 mysqlapi]# ps aux |grep super root 15458 0.0 0.0 147148 7976 ? Ss 16:23 0:00 /usr/bin/python /usr/bin/supervisord root 15533 0.0 0.0 61268 792 pts/3 S+ 16:23 0:00 grep super 查看进程状态: [root@typhoeus79 mysqlapi]# supervisorctl mysqlapi RUNNING pid 15460, uptime 0:01:19 supervisor> status mysqlapi RUNNING pid 15460, uptime 0:01:21 supervisor> exit [root@typhoeus79 mysqlapi]# ps aux |grep 8005 root 15460 0.2 0.0 208436 15484 ? S 16:23 0:00 python2.6 /data1/guosong/mysqlapi/main/api_main.py --port=8005 root 16314 0.0 0.0 61268 788 pts/3 S+ 16:24 0:00 grep 8005 [root@typhoeus79 mysqlapi]# kill 测试: [root@typhoeus79 mysqlapi]# ps aux |grep 8005 root 15460 0.2 0.0 208436 15484 ? S 16:23 0:00 python2.6 /data1/guosong/mysqlapi/main/api_main.py --port=8005 root 16314 0.0 0.0 61268 788 pts/3 S+ 16:24 0:00 grep 8005
  3. 3. [root@typhoeus79 mysqlapi]# [root@typhoeus79 mysqlapi]# kill 15460 [root@typhoeus79 mysqlapi]# ps aux |grep 8005 root 17431 21.0 0.0 208436 15484 ? S 16:25 0:00 python2.6 /data1/guosong/mysqlapi/main/api_main.py --port=8005 root 17437 0.0 0.0 61268 772 pts/3 R+ 16:25 0:00 grep 8005 [root@typhoeus79 mysqlapi]# kill -9 17431 [root@typhoeus79 mysqlapi]# ps aux |grep 8005 |grep -v grep root 17540 7.0 0.0 208440 15488 ? S 16:25 0:00 python2.6 /data1/guosong/mysqlapi/main/api_main.py --port=8005 [root@typhoeus79 mysqlapi]# 使用 kill 以及 kill -9 进程的 id 都发生变化 使用 supervisorctl 进行程序重启: [root@typhoeus79 mysqlapi]# supervisorctl stop all mysqlapi: stopped [root@typhoeus79 mysqlapi]# ps aux |grep 8005 |grep -v grep [root@typhoeus79 mysqlapi]# supervisorctl start all mysqlapi: started [root@typhoeus79 mysqlapi]# ps aux |grep 8005 |grep -v grep root 19649 3.0 0.0 208440 15488 ? S 16:28 0:00 python2.6 /data1/guosong/mysqlapi/main/api_main.py --port=8005 [root@typhoeus79 mysqlapi]# 5、Demo2 测试 守护多个进程,修改/etc/supervisord.conf 配置 [program:mysqlapi] command=python26 /data1/guosong/mysqlapi/main/api_main.py --port=140%(process_num)02d process_name=%(program_name)s_%(process_num)02d ; process_name expr (default %(program_name)s) numprocs=8 numprocs_start=81 startretries=3 stopwaitsecs=10
  4. 4. autorstart=true log_stdout=true log_stderr=true logfile=/data1/guosong/mysqlapi/log/mysql_api_demo.log 超过 2 位数如何表示? command=python26 /data1/guosong/mysqlapi/main/api_main.py --port=140%(process_num)02d 结果演示: 6、问题集锦 问题 1-mysqlapi entered FATAL state, too many start retries too quickly: 2014-05-15 17:26:30,898 INFO exited: mysqlapi (exit status 1; not expected) 2014-05-15 17:26:30,899 INFO received SIGCLD indicating a child quit 2014-05-15 17:26:31,901 INFO gave up: mysqlapi entered FATAL state, too many start retries too quickly 原因在于版本导致,api 的脚本版本为 python26,故使用 supervisord 也需要使用 python26 进行安装,查看进程信息如下: root 24058 0.0 0.0 151420 10204 ? Ss 18:28 0:00 /usr/bin/python26 /usr/bin/supervisord -c /etc/supervisord.conf 问题 2- http://127.0.0.1:9001 refused connection: [root@typhoeus79 20140515]# supervisorctl http://10.75.xxx.xxx:9001 refused connection
  5. 5. 原因在于没有开启 inet_http_server,配置文件默认使用分号注释每行 将 inet_http_server 前面的分号去除后,重新开启 supervisord [root@typhoeus79 20140515]# /etc/init.d/supervisord stop Stopping supervisord: [ OK ] [root@typhoeus79 20140515]# supervisord -c /etc/supervisord.conf [root@typhoeus79 20140515]# supervisorctl mysqlapi:mysqlapi_81 RUNNING pid 32513, uptime 0:00:02 mysqlapi:mysqlapi_82 RUNNING pid 32511, uptime 0:00:02 mysqlapi:mysqlapi_83 RUNNING pid 32512, uptime 0:00:02 mysqlapi:mysqlapi_84 RUNNING pid 32509, uptime 0:00:02 mysqlapi:mysqlapi_85 RUNNING pid 32510, uptime 0:00:02 mysqlapi:mysqlapi_86 RUNNING pid 32507, uptime 0:00:02 mysqlapi:mysqlapi_87 RUNNING pid 32508, uptime 0:00:02 mysqlapi:mysqlapi_88 RUNNING pid 32514, uptime 0:00:02 访问界面:

×