uwsgi 在 运行 作为 systemd 服务时损坏了管道
uwsgi broken pipe when running it as systemd service
我正在使用 python 2.7.11.
在 conda 虚拟环境中 运行 安装 uwsgi/flask python 应用程序
我正从 CentOS 6 迁移到 CentOS 7,并希望将 systemd 用于 运行 我的应用程序即服务。如果我手动调用我的应用程序的启动脚本 (sh start-foo.sh
),一切(配置和代码)都可以正常工作,但是当我尝试将其作为系统服务启动时(sudo systemctl foo start
),它会启动该应用程序,但随后失败立即出现以下错误:
WSGI app 0 (mountpoint='') ready in 8 seconds on interpreter 0x14c38d0 pid: 3504 (default app)
mountpoint already configured. skip.
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 3504)
emperor_notify_ready()/write(): Broken pipe [core/emperor.c line 2463]
VACUUM: pidfile removed.
这是我的 systemd 单元文件:
[Unit]
Description=foo
[Service]
ExecStart=/bin/bash /app/foo/bin/start-foo.sh
ExecStop=/bin/bash /app/foo/bin/stop-foo.sh
[Install]
WantedBy=multi-user.target
不确定是否需要,但这是我的 uwsgi emperor 和 vassal 配置:
皇帝
[uwsgi]
emperor = /app/foo/conf/vassals/
daemonize = /var/log/foo/emperor.log
附庸国
[uwsgi]
http-timeout = 500
chdir = /app/foo/scripts
pidfile = /app/foo/scripts/foo.pid
#socket = /app/foo/scripts/foo.soc
http = :8888
wsgi-file = /app/foo/scripts/foo.py
master = 1
processes = %(%k * 2)
threads = 1
module = foo
callable = app
vacuum = True
daemonize = /var/log/foo/uwsgi.log
我试图 Google 解决这个问题,但似乎找不到任何相关内容。我怀疑这与在虚拟环境中 运行ning uwsgi 并使用 systemctl 启动它有关。我是 systemd n00b,所以如果我在我的单元文件中做错了什么,请告诉我。
这不是阻止程序,因为我仍然可以通过手动执行脚本 start/stop 我的应用程序,但我希望能够 运行 它作为一项服务并在启动时自动启动它使用 systemd。
按照 uwsgi 文档中关于设置 systemd 服务的说明 here 解决了这个问题。
这是我更改的内容:
已从 Emperor 和 Vassal 配置中删除 daemonize
。
从上面的 link 中获取单元文件并稍作修改以与我的应用程序一起使用
[Unit]
Description=uWSGI Emperor
After=syslog.target
[Service]
ExecStart=/app/foo/bin/uwsgi /app/foo/conf/emperor.ini
RuntimeDirectory=uwsgi
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
[Install]
WantedBy=multi-user.target
我正在使用 python 2.7.11.
在 conda 虚拟环境中 运行 安装 uwsgi/flask python 应用程序我正从 CentOS 6 迁移到 CentOS 7,并希望将 systemd 用于 运行 我的应用程序即服务。如果我手动调用我的应用程序的启动脚本 (sh start-foo.sh
),一切(配置和代码)都可以正常工作,但是当我尝试将其作为系统服务启动时(sudo systemctl foo start
),它会启动该应用程序,但随后失败立即出现以下错误:
WSGI app 0 (mountpoint='') ready in 8 seconds on interpreter 0x14c38d0 pid: 3504 (default app)
mountpoint already configured. skip.
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 3504)
emperor_notify_ready()/write(): Broken pipe [core/emperor.c line 2463]
VACUUM: pidfile removed.
这是我的 systemd 单元文件:
[Unit]
Description=foo
[Service]
ExecStart=/bin/bash /app/foo/bin/start-foo.sh
ExecStop=/bin/bash /app/foo/bin/stop-foo.sh
[Install]
WantedBy=multi-user.target
不确定是否需要,但这是我的 uwsgi emperor 和 vassal 配置:
皇帝
[uwsgi]
emperor = /app/foo/conf/vassals/
daemonize = /var/log/foo/emperor.log
附庸国
[uwsgi]
http-timeout = 500
chdir = /app/foo/scripts
pidfile = /app/foo/scripts/foo.pid
#socket = /app/foo/scripts/foo.soc
http = :8888
wsgi-file = /app/foo/scripts/foo.py
master = 1
processes = %(%k * 2)
threads = 1
module = foo
callable = app
vacuum = True
daemonize = /var/log/foo/uwsgi.log
我试图 Google 解决这个问题,但似乎找不到任何相关内容。我怀疑这与在虚拟环境中 运行ning uwsgi 并使用 systemctl 启动它有关。我是 systemd n00b,所以如果我在我的单元文件中做错了什么,请告诉我。
这不是阻止程序,因为我仍然可以通过手动执行脚本 start/stop 我的应用程序,但我希望能够 运行 它作为一项服务并在启动时自动启动它使用 systemd。
按照 uwsgi 文档中关于设置 systemd 服务的说明 here 解决了这个问题。
这是我更改的内容:
已从 Emperor 和 Vassal 配置中删除 daemonize
。
从上面的 link 中获取单元文件并稍作修改以与我的应用程序一起使用
[Unit]
Description=uWSGI Emperor
After=syslog.target
[Service]
ExecStart=/app/foo/bin/uwsgi /app/foo/conf/emperor.ini
RuntimeDirectory=uwsgi
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
[Install]
WantedBy=multi-user.target