FileNotFoundError: [Errno 2] No such file or directory: 'bash' when running gunicorn server from .service file

FileNotFoundError: [Errno 2] No such file or directory: 'bash' when running gunicorn server from .service file

在 运行 使用我的 gunicorn python 应用程序表单 .service 文件时出现 FileNotFoundError: [Errno 2] No such file or directory: 'bash' 错误。

但是 运行ning gunicorn 命令本身(不是来自 .service 文件)工作正常。

gunicorn 命令 运行 应用程序

gunicorn -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 1 --bind <server_ip>:8080 wsgi

app.service 文件

[Service]
User=user
WorkingDirectory=/home/user/app
Environment="PATH=/home/user/app/app_venv/bin"
ExecStart=/home/user/app/app_venv/bin/gunicorn -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker --workers 1 --bind <server_ip>:8080 wsgi

Python 产生错误的代码

import subprocess

cmd = ['bash', 'script.sh' , args.get('arg')]
try:
    process = subprocess.Popen(cmd,
                               cwd=/path/to/bash_script,
                               stdout=subprocess.PIPE,
                               stderr=subprocess.STDOUT,
                               universal_newlines=True)
    while process.poll() is None:
        output = process.stdout.readline()
        if(output==''):
            break
        emit('tg_output', output)

except subprocess.CalledProcessError as error:
    pass

IMO bash 命令不在 user PATH 中。最好始终使用 bash 命令的完整路径。

cmd = ['/bin/bash', 'script.sh' , args.get('arg')]

使用which bash获取完整路径。

您正在明确设置

Environment="PATH=/home/user/app/app_venv/bin"

您需要 PATH 包含您要使用的任何外部二进制文件的所有目录(事实上,如果您 运行无论如何都要用完整路径来处理它;所以最好的解决办法可能就是从文件中完全删除这个PATH赋值)。

您的 Bash 脚本似乎不需要 Python 到 运行 它,而您创建的 Python 包装器似乎 运行有错误(特别是毯子 except 看起来令人不安);也许更好的解决方案是 运行 一个单独的 Bash 进程。