运行 一个 python 有主管的脚本

Run a python script with supervisor

here 复制到 运行 我的 Python 代码作为守护进程。 额外的正常运行时间。我认为使用 supervisor 来保留这个守护进程是一个更好的主意 运行ning.

我做到了。 python_deamon.conf

[program:python_deamon]
directory=/usr/local/python_deamon/
command=/usr/local/python_venv/bin/python daemon_runnner.py start
stderr_logfile=/var/log/gunicorn.log
stdout_logfile=/var/log/gunicorn.log
autostart=true
autorestart=true

问题是,尽管主管成功启动了 python_daemon,但它一直在重试。

2015-09-23 16:10:45,592 CRIT Supervisor running as root (no user in config file)
2015-09-23 16:10:45,592 WARN Included extra file "/etc/supervisor/conf.d/python_daemon.conf" during parsing
2015-09-23 16:10:45,592 INFO RPC interface 'supervisor' initialized
2015-09-23 16:10:45,592 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2015-09-23 16:10:45,592 INFO supervisord started with pid 13880
2015-09-23 16:10:46,595 INFO spawned: 'python_deamon' with pid 17884
2015-09-23 16:10:46,611 INFO exited: python_deamon (exit status 1; not expected)
2015-09-23 16:10:47,614 INFO spawned: 'python_deamon' with pid 17885
2015-09-23 16:10:47,630 INFO exited: python_deamon (exit status 1; not expected)
2015-09-23 16:10:49,635 INFO spawned: 'python_deamon' with pid 17888
2015-09-23 16:10:49,656 INFO exited: python_deamon (exit status 1; not expected)
2015-09-23 16:10:52,662 INFO spawned: 'python_deamon' with pid 17891
2015-09-23 16:10:52,680 INFO exited: python_deamon (exit status 1; not expected)
2015-09-23 16:10:53,681 INFO gave up: python_deamon entered FATAL state, too many start retries too quickly

只是为了记录在覆盖 run() 方法之后我从来没有 return 任何东西。

有没有可能做我想做的事,还是我太笨了?

P.S:我知道整个问题的根本原因是因为 运行() 从来没有 return 主管保留任何东西试图启动它,因此认为该过程失败并给出状态 FATAL Exited too quickly (process log may have details)

我真正的问题是我做对了吗?或者可以这样做吗?

P.P.S:独立(没有主管)daemon_runnner.py 运行有和没有 sudo 权限都可以。

您的脚本失败并显示退出状态。 Supervisor 只是想重新启动脚本。

Supervisor 是用 root 权限启动的,也许它正在将这些权限授予您的脚本,这导致它失败(源目录中的更改或其他内容)。检查当你 运行 你的守护进程作为没有 Supervisor 的 root 时会发生什么。

我们确实需要更多信息来了解失败的原因。

不确定daemon runner是否有同样的问题,但是如果你直接使用daemon context并使用supervisord,你需要设置context.detach_process为False

尝试设置 startsecs = 0:

[program:foo]
command = ls
startsecs = 0
autorestart = false
http://supervisord.org/configuration.html

startsecs

程序在启动后需要停留 运行 的总秒数以认为启动成功。如果程序在启动后没有保持这么多秒,即使它以“预期的”退出代码(请参阅退出代码)退出,也将被视为启动失败。设置为 0 表示程序不需要停留 运行 任何特定的时间。

这是我通常做的事情:

  • 创建一个 service.conf 文件来描述新的 Python 脚本。该脚本引用 shell 脚本,它实际上是启动 Python 脚本的脚本。此 .conf 文件位于 /etc/supervisor/conf.d/
  • 创建一个 shell 脚本来启动 Python 脚本。更改可执行权限。 chmod 755 service.sh。在这个脚本中,我们实际上启动了 Python 脚本。
  • 配置 log_stderrstderr_logfile 以验证问题。
  • 使用重新加载更新主管,然后检查状态:

supervisor> status

alexad RUNNING pid 32657, uptime 0:21:05

service.conf

[program:alexad]
; Set full path to celery program if using virtualenv

command=sh /usr/local/src/gonzo/supervisorctl/alexad.sh
directory=/usr/local/src/gonzo/services/alexa
log_stdout=true             ; if true, log program stdout (default true)
log_stderr=true             ; if true, log program stderr (default false)
stderr_logfile=/usr/local/src/gonzo/log/alexad.err
logfile=/usr/local/src/gonzo/log/alexad.log
autostart=true
autorestart=true
startsecs=10

; Need to wait for currently executing tasks to finish at shutdown.
; Increase this if you have very long running tasks.
stopwaitsecs = 600

; When resorting to send SIGKILL to the program to terminate it
; send SIGKILL to its whole process group instead,
; taking care of its children as well.
killasgroup=true

; Set Celery priority higher than default (999)
priority=500

service.sh

#!/bin/bash
cd /usr/local/src/gonzo/services/alexa
exec python reader.py