2016-05-02 1 views
2

スーパーバイザを使用して仮想環境で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 
+0

これは、 'psql'コマンドが見つからない場合があります。 'psql'が存在する完全なパスを与えてください。 – redoc

+0

ちょっとレドック!あなたはそれを男に釘付けにした。まさにこれが理由だった。このコードは大きなシステムの一部でした。以下の@Sergeyで提案されているように、私たちはpyscopg2を使っていくつかの部分を行いましたが、あなたはそれをmanに保存しました。 –

+0

私はそれの理由を得た。私たちは監督者の間にシステムのPATH変数を再割り当てしましたので、そのパスを見つけることができません –

答えて

0

問題はスーパーバイザ設定にありました。それはpsqlを見つけようとしていて、それのパスを取得しようとしていませんでした。理由は監督confの間違ったパス変数です。うまくいきました。

変更:PATHを削除し、仮想envのpythonの完全な実行可能パスを指定しました。

[program:myprog] 
command=/home/ubuntu/.virtualenvs/myvirtualenv/bin/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 
1

あなたは、データベースの存在をテストするので、洗練された方法を必要としないのです。これを試してみてください:

import psycopg2 

def database_exists(database_name): 
    con = None 
    res = None 
    try: 
     con = psycopg2.connect(database="test", user="test", password="abcd", host="127.0.0.1") #It's better to get the parameters from settings 
     cur = con.cursor() 
     cur.execute("SELECT exists(SELECT 1 from pg_catalog.pg_database where datname = %s)", (database_name,)) 
     res = cur.fetchone()[0] 
    except psycopg2.DatabaseError as e: 
     res = False 
    finally: 
     if con: 
      con.close() 
    return res 
+0

答えをありがとう。これは、psqlではなくクエリを実行するためのより良い方法のようです。 100%が同意した。どうもありがとう 。 –

+0

私は答えをアップアップしましたが、私の問題の解決策がスーパーバイザーの設定であったので、それを受け入れることができませんでした –

+0

スーパーバイザーに関しては、実行ファイル(psql、cut、grep)への絶対パスを使用してみてください。 –

関連する問題