スーパーバイザを使用して仮想環境でdjangoアプリケーションを実行しています。スーパーバイザはroot
によって実行され、アプリケーションはユーザubuntu
によって実行されます。djangoを使ってpostgresデータベースexistenseをチェックすると、OSエラーがスローされます。
データベースがポストグルに存在するかどうかをチェックしたいと思います。以下の私の関数は通常のPythonシェル(Repl)でもよく、python migrate.py runserver
を使ってアプリケーションを実行しても、djangoシェルでさえもうまく動作します。
しかし、すぐに私はスーパーバイザーを使用して、アプリケーションとそのコードブロックの実行を開始すると、私は次の例外を取得 -
Exception Type: OSError Exception Value:[Errno 2] No such file or directory
ここで私が失敗した
def database_exists(database_name):
try:
db= "anydbname"
c1 = "psql -U postgres -lqt"
c2 = "cut -d | -f 1"
c3 = "grep -w " + db
ps1 = subprocess.Popen(c1.split(),stdout=subprocess.PIPE)
ps2 = subprocess.Popen(c2.split(),stdin=ps1.stdout, stdout=subprocess.PIPE)
ps3 = subprocess.Popen(c3.split(),stdin=ps2.stdout , stdout=subprocess.PIPE)
result = ps3.communicate()[0] # if empty , db not found
result = result.strip()
if result == "" :
return False
else :
return True
except Exception, e:
raise e
return False, str(e)
ある機能です正確なディレクトリやファイルが何であるかを理解してください。それはどのような種類の許可の問題ですか?しかし、普通のシェルでさえ、ubuntu
ユーザーを使って実行されているので、権限エラーではないようです。スーパーバイザで実行すると見つからないファイルをどのようにデバッグするのですか?私はスーパーバイザーにログを追加しましたが、<request url > HTTP/1.0" 500
しか表示されていないので、それについての手がかりはありません。
ここでは、スーパーバイザ設定
[program:myprog]
environment=PATH="/home/ubuntu/.virtualenvs/myvirtualenv/bin"
command=python /var/www/myapp/manage.py rungevent 127.0.0.1:8010 250
directory=/var/www/myapp
autostart=true
autorestart=true
redirect_stderr=True
killasgroup=true
stopasgroup=true
user=ubuntu
stdout_logfile = /var/log/supervisor/myapp.log
stderr_logfile = /var/log/supervisor/myapp-err.log
これは、 'psql'コマンドが見つからない場合があります。 'psql'が存在する完全なパスを与えてください。 – redoc
ちょっとレドック!あなたはそれを男に釘付けにした。まさにこれが理由だった。このコードは大きなシステムの一部でした。以下の@Sergeyで提案されているように、私たちはpyscopg2を使っていくつかの部分を行いましたが、あなたはそれをmanに保存しました。 –
私はそれの理由を得た。私たちは監督者の間にシステムのPATH変数を再割り当てしましたので、そのパスを見つけることができません –