Obtenir une erreur FileNotFoundError: [Errno 2] No such file or directory: 'bash' lors de l'exécution de mon fichier .service du formulaire de l'application python gunicorn.

Cependant, l'exécution de la commande gunicorn seule (pas à partir d'un fichier .service) fonctionne correctement.

Commande gunicorn pour exécuter l'application

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

Fichier 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

Code Python qui génère l'erreur

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
2
smriti 19 mars 2019 à 07:52

2 réponses

Meilleure réponse

Vous définissez explicitement

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

Vous avez besoin que PATH contienne tous les répertoires des binaires externes que vous souhaitez utiliser (et en fait, il n'est pas vraiment nécessaire qu'il contienne le répertoire de votre script, si vous l'exécutez de toute façon par le chemin complet ; donc la meilleure solution est probablement simplement de supprimer cette affectation PATH du fichier).

Votre script Bash ne semble pas avoir besoin de Python pour l'exécuter, et l'encapsuleur Python que vous avez créé pour l'exécuter semble avoir des bogues (en particulier, la couverture except semble angoissante); une meilleure solution serait peut-être d'exécuter un processus Bash distinct.

4
tripleee 19 mars 2019 à 05:21

IMO, la commande bash n'est pas dans le CHEMIN utilisateur . Il est préférable de toujours utiliser le chemin complet de la commande bash.

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

Utilisez which bash pour obtenir le chemin complet.

-1
Laurent LAPORTE 19 mars 2019 à 05:03