2009-07-07 12 views
5

データを読み込むための簡単なweb.pyプログラムがあります。サーバーでは、私はApacheやWebサーバーをインストールしたくありません。デーモンとしてweb.pyを実行

は私がhttp://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/

そしてサブクラスでバックグラウンドサービスとしてそれを入れてみてください:

class Daemon: 
    def start(self): 
     """ 
     Start the daemon 
     """ 
     ... PID CHECKS.... 

     # Start the daemon 
     self.daemonize() 
     self.run() 
#My code 
class WebService(Daemon): 
     def run(self): 
      app.run() 

if __name__ == "__main__": 
    if DEBUG: 
     app.run() 
    else: 
     service = WebService(os.path.join(DIR_ACTUAL,'ElAdministrador.pid')) 
     if len(sys.argv) == 2: 
      if 'start' == sys.argv[1]: 
       service.start() 
      elif 'stop' == sys.argv[1]: 
       service.stop() 
      elif 'restart' == sys.argv[1]: 
       service.restart() 
      else: 
       print "Unknown command" 
       sys.exit(2) 
      sys.exit(0) 
     else: 
      print "usage: %s start|stop|restart" % sys.argv[0] 
      sys.exit(2) 

しかし、web.pyソフトウェアがロードされない (http://www.jejik.com/files/examples/daemon.pyから)(すなわち:サービスには聞いていません)

私が直接呼び出すと(つまり:デーモンコードを使用しない)うまく動作します。

答えて

5

最後に問題が見つかりました。

Web.pyは、コマンドラインからオプションのポート番号受け入れる:

python code.py 80 

を、スクリプトが、コマンドラインから入力を取る:

python WebServer start 

その後、使用しようとweb.pyポート番号として「開始」し、失敗します。私はバックグラウンドにあったので、エラーは表示されません。

私はこれはミニハックで固定:あなたがここに書いたように

if __name__ == "__main__": 
    if DEBUG: 
     app.run() 
    else: 
     service = WebService(os.path.join(DIR_ACTUAL,'ElAdministrador.pid')) 
     if len(sys.argv) == 2: 
      if 'start' == sys.argv[1]: 
       sys.argv[1] = '8080' 
       service.start() 
0

私はあなたがデーモンに実行を指示しているとは思わない。 MyDaemonオブジェクトをインスタンス化し、o.run()を呼び出す必要があります。 WebServiceは、実際のWebアプリケーション自体ではなく、Webアプリケーションへのサービスインターフェイスの開始と停止のみを行うように見えます。

+0

"start"という呼び出しが "run"メソッドと呼ばれるときに表示される質問を更新します。 – mamcx

+0

暗黙的な場合を除き、私はまだサービス(WebServiceから)がMyDaemonにどのように接続するかを知ることができません。 – mcandre

+0

ああ、私の間違い:(私は正しいclassName(悪いキティのコピー/ペースト!) – mamcx

4

あなたは、このコマンド

/usr/bin/python index.py > log.txt 2>&1 & 
0

を使用して代わりの第2引数を上書きすることにより、web.pyを起動することができます。

if __name__ == "__main__": 
    if DEBUG: 
     app.run() 
    else: 
     service = WebService(os.path.join(DIR_ACTUAL,'ElAdministrador.pid')) 
     if len(sys.argv) == 2: 
      if 'start' == sys.argv[1]: 
       sys.argv[1] = '8080' 
       service.start() 

のように、 'start | restart'で2番目の引数を削除できます
if __name__ == "__main__": 
    if DEBUG: 
     app.run() 
    else: 
     service = WebService(os.path.join(DIR_ACTUAL,'ElAdministrador.pid')) 
     if len(sys.argv) == 2: 
      if 'start' == sys.argv[1]: 
       delete del sys.argv[1:2] 
       service.start() 

このように、webpyは、デーモンコントローラ以外のコマンドラインから渡したすべての引数を受け取ります。

python WebServer start 8080 
関連する問題