2011-08-11 10 views
5

私はちょうど私のアプリを終了し、それを展開したいと思います。しかし、サービス/デーモンとして私のアプリを実行する方法は?webapp2をappengineの外で実行していますが、サービス/デーモンとして実行するにはどうすればいいですか?

Google検索では、いくつかのPythonライブラリを使用して、いくつかの異なる承認を示しました。ねじれ、Can I run a Python script as a service?。しかし、それを行う方法を理解することはできません。

いずれか1人がこれを行いましたか?ベストプラクティスのアプローチはありますか?

..fredrik

+0

なぜデーモンとして実行しますか? – moraes

+0

'python main.py 'で走るのはちょっと危険です。それが失敗するかクラッシュする場合、自動的に再起動して、デーモンがログファイルに書き込むようにします。 – fredrik

+0

@fredrik私は、クラッシュの処理と私の答えへのログについての詳細を追加 – MatToufoutu

答えて

4

あなたは(私が正しく理解されている場合)、アプリケーションをスタンドアロン実行するとして、あなたは他の(非Web)アプリケーションと同じように、これを扱うことができます。

プログラムをバックグラウンドで実行したい場合は、this receipeを読んでデーモンアプリケーションの作成方法を説明し、(トピック内の)このトピックに関するコメントを参考にしてください。

一方、アプリケーション(システムの起動時に起動する)で「システムデーモン」を作成する場合は、シェルスクリプトを使用します。システムのスタートアップスクリプトを作成する方法を知るには、マシン上の他のスタートアップスクリプトからインスピレーションを得ることができます。解決策は、python my_app.py &(スタートアップスクリプトから)でバックグラウンドでプログラムを実行し、$!変数を使用してプロセスのpidを取得し、ファイルに保存することです。この方法でプロセスを停止することもできます「pidファイル」を読んでkillコマンドを使用してください(SIGINTをプロセスに送信すると、アプリケーションではKeyboardInterrupt例外が発生します)。

EDIT:あなたの質問のコメントで

、あなたはアプリケーションがクラッシュした/失敗した場合は再起動しないだろうが、それはあなたのシステム上の他のデーモンと同じだとするために(安全ではないだろうpython main.py &を使用して言います例えば、Apacheがクラッシュした場合、それ自体は再起動しません)。クラッシュした場合にアプリケーションを再起動したい場合は、2番目のデーモンを作成する必要があります.2番目のデーモンは、アプリケーションが実行中であれば定期的にチェックし、必要に応じて再起動します。

ロギングについては、アプリケーションをstdout/stderrに出力し、起動スクリプト(python main.py &> /path/to/app.log &)からリダイレクトするか、loggingモジュールを使用してアプリケーションからログを処理することができます。

+0

ありがとう。ロギングについて: 'python main.py'を実行すると、「http://127.0.0.1:8080で提供」と表示されます。しかし、 'sudo python main.py&> /var/log/apns.log&'を実行すると、ログファイルに何も追加されません。 main.pyの 'logging.info( 'started')'も試しました。ログファイルには何も起こりません(しかし、サーバーはokeyを開始します)。何か案が? – fredrik

+0

@fredrikおそらくあなたのアプリは/ var/logに書き込む権利を持っていません – MatToufoutu

+0

@agf: '&>'は既にstdoutとstderrの両方をリダイレクトしています – MatToufoutu

2

また、deamonizedプロセスをsupervisordで簡単に実行して制御し、stdout/stderr出力も簡単にログに記録できます。実際のpythonを悪魔化されたPythonスクリプトを悪魔化

+0

http://packages.ubuntu.com/supervisor | http://packages.gentoo.org/package/app-admin/supervisor | http://aur.archlinux.org/packages.php?K=supervisor | http://rpm.pbone.net/index.php3?stat=3&search=supervisor *(編集済みの書式)* – iki

1

あなたがrootであれば、GNU screenを使ってその仕事をすることを検討してください。画面自体は、デーモンプロセスを構築する上で最も複雑なタスクである端末制御を処理します。

スクリーンを起動し、プログラムを実行して、デタッチしてからログアウトしてください。デーモンのようなプロセスが残ってしまいます。このアプローチは、特にプログラムが構築中であっても、あまり安定していない場合や、デバッグのためにすばやく書かれたメッセージを多数ダンプする場合に効果的です。

ファイルシステムをアンマウントするか、シグナルハンドルを再プログラムする必要がある場合などに作業ディレクトリを/とクローズドディスクリプタに変更するなど、プログラムをデーモン化する際に注意すべき点がいくつかあります。しかし、 initまたはクリーンなログインセッションからプロセスをデーモン化すると、ほとんどの条件が満たされます。通常はディレクトリを "/"に変更することを忘れないでください。

しかし、画面を使用してもクラッシュで生き残ることはできません。クラッシュは常にプログラマが処理しなければならないものです。

関連する問題