Systemd +非root Gunicorn服务= defunct subprocess

时间:2016-09-27 18:19:58

标签: python subprocess gunicorn systemd

我正在关注this document为我的gunicorn服务器设置Systemd套接字和服务。

  • Systemd将gunicorn作为www-data
  • 启动
  • gunicorn分叉自己(默认行为)
  • 服务器使用subprocess.Popen()
  • 启动子流程
  • 子进程没有错误地完成,但是父进程从p.poll()而不是退出代码中获取None
  • 子流程最终解散

以下是流程层次结构:

$ ps eauxf
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
...
www-data 14170  0.0  0.2  65772 20452 ?        Ss   10:57   0:00 /usr/bin/python /usr/bin/gunicorn digits.webapp:app --pid /run/digits/pid --config /usr/lib/python2.7/dist-packages/digits/gunicorn_config.py
www-data 14176  0.8  3.4 39592776 283124 ?     Sl   10:57   0:05  \_ /usr/bin/python /usr/bin/gunicorn digits.webapp:app --pid /run/digits/pid --config /usr/lib/python2.7/dist-packages/digits/gunicorn_config.py
www-data 14346  5.0  0.0      0     0 ?        Z    11:07   0:01      \_ [python] <defunct>

以下是踢球者:当我以root而不是www-data运行服务时,一切都按预期工作。子进程完成,父进程立即获取子进程的返回码。

/lib/systemd/system/digits.service

[Unit]
Description=DIGITS daemon
Requires=digits.socket
After=local-fs.target network.target
[Service]
PIDFile=/run/digits/pid
User=www-data
Group=www-data
Environment="DIGITS_JOBS_DIR=/var/lib/digits/jobs"
Environment="DIGITS_LOGFILE_FILENAME=/var/log/digits/digits.log"
ExecStart=/usr/bin/gunicorn digits.webapp:app \
    --pid /run/digits/pid \
    --config /usr/lib/python2.7/dist-packages/digits/gunicorn_config.py
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target

/lib/systemd/system/digits.socket

[Unit]
Description=DIGITS socket
[Socket]
ListenStream=/run/digits/socket
ListenStream=0.0.0.0:34448
[Install]
WantedBy=sockets.target

/usr/lib/tmpfiles.d/digits.conf

d /run/digits 0755 www-data www-data -

1 个答案:

答案 0 :(得分:1)

我今天在 CentOS-7 上遇到了同样的问题。我最后通过忽略this document中的指令来克服它 - 它指示使用/run/层次结构来创建套接字 - 我改为使用/tmp/。这很有用。

请注意,我的PID文件仍位于/run/下方(没有问题)。

总之,不要将套接字放在/run/...下面的某个位置,而是将其放在/tmp/...下面的某个位置。它通过 systemd CentOS-7 上为我工作。