部署Flask应用:无法通过Systemd运行myproject.service求助
Gunicorn通过Systemd启动失败的排查与解决
问题背景
部署Flask应用时,已完成虚拟环境创建、Gunicorn和Flask安装,myproject.py与wsgi.py可正常执行。命令行直接调用虚拟环境内的Gunicorn能正常运行并访问网页:
(venv) dconran@dconran-VirtualBox:~/python/dg$ /home/dconran/python/dg/venv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app
但通过systemctl start myproject启动服务时失败,执行sudo systemctl status myproject得到错误日志。
错误日志
× myproject.service - Gunicorn instance to serve myproject Loaded: loaded (/etc/systemd/system/myproject.service; enabled; preset: enabled) Active: failed (Result: exit-code) since Fri 2025-02-14 12:40:11 GMT; 23s ago Duration: 12ms Main PID: 6526 (code=exited, status=2) CPU: 5ms Feb 14 12:40:11 dconran-VirtualBox systemd[1]: Started myproject.service - Gunicorn instance to serve myproject. Feb 14 12:40:11 dconran-VirtualBox bash[6527]: /home/dconran/python/dg/venv/bin/gunicorn: line 3: import: command not found Feb 14 12:40:11 dconran-VirtualBox bash[6528]: /home/dconran/python/dg/venv/bin/gunicorn: line 4: import: command not found Feb 14 12:40:11 dconran-VirtualBox bash[6529]: /home/dconran/python/dg/venv/bin/gunicorn: line 5: from: command not found Feb 14 12:40:11 dconran-VirtualBox bash[6526]: /home/dconran/python/dg/venv/bin/gunicorn: line 7: syntax error near unexpected token `(' Feb 14 12:40:11 dconran-VirtualBox bash[6526]: /home/dconran/python/dg/venv/bin/gunicorn: line 7: ` sys.argv[0] = re.sub(r'(-script\.> Feb 14 12:40:11 dconran-VirtualBox systemd[1]: myproject.service: Main process exited, code=exited, status=2/INVALIDARGUMENT Feb 14 12:40:11 dconran-VirtualBox systemd[1]: myproject.service: Failed with result 'exit-code'.
当前myproject.service配置
[Unit] Description=Gunicorn instance to serve myproject After=network.target [Service] User=dconran Group=www-data WorkingDirectory=/home/dconran/python/dg Environment="PATH=/home/dconran/python/dg/venv/bin" ExecStart=/usr/bin/bash /home/dconran/python/dg/venv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app [Install] WantedBy=multi-user.target
问题原因
ExecStart里用/usr/bin/bash执行gunicorn是错误操作——gunicorn是Python脚本,bash无法解析Python语法,因此出现import: command not found这类语法错误。
解决方法
修改myproject.service中的ExecStart行,直接调用虚拟环境内的gunicorn,无需通过bash中转:
[Unit] Description=Gunicorn instance to serve myproject After=network.target [Service] User=dconran Group=www-data WorkingDirectory=/home/dconran/python/dg Environment="PATH=/home/dconran/python/dg/venv/bin" ExecStart=/home/dconran/python/dg/venv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app [Install] WantedBy=multi-user.target
修改完成后,重新加载systemd配置并重启服务:
sudo systemctl daemon-reload sudo systemctl restart myproject
内容的提问来源于stack exchange,提问作者Doug Conran
相关产品推荐
相关产品推荐

