运行从.service文件启动gunicorn服务器时出现“FileNotFoundError: [Errno 2] No such file or directory: 'bash'”。

3

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

但是,单独运行gunicorn命令(而不是从.service文件中运行)可以正常工作。

运行应用程序的gunicorn命令

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

应用程序服务文件

[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

1
环境变量="PATH=/home/user/app/app_venv/bin:$PATH" - Alex Kroll
@smriti,你是如何解决这个问题的?能否请你解释一下? - Deep
2个回答

5

您正在明确设置

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

如果你想要使用任何外部二进制文件,就需要将 PATH 包含所有的目录。实际上,如果你通过完整路径运行脚本的话,其实不需要将脚本所在的目录包含到 PATH 中;因此最好的解决方案可能是从文件中完全删除这个 PATH 赋值。

你的 Bash 脚本似乎不需要 Python 才能运行,而你创建的用来运行它的 Python 封装似乎存在错误(特别是那个全局异常处理让人不安)。或许更好的解决方案是单独运行一个 Bash 进程。


-1

在我看来,bash 命令不在 用户 PATH 中。最好始终使用完整路径的 bash 命令。

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

使用 which bash 命令获取完整路径。


这并不是一个坏建议;但问题是他们完全清除了他们的PATH,所以基本上_没有什么东西_能够在没有完整路径的情况下工作。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接