アプリを完成させ、デプロイしたいと考えています。しかし、アプリをサービス/デーモンとして実行するにはどうすればよいですか?
Google検索では、いくつかのpythonライブラリを使用したいくつかの異なるアプローチが示され、ねじれ、Pythonスクリプトをサービスとして実行できますか? . しかし、それを行う方法がわかりません。
誰もこれをしましたか?ベストプラクティスのアプローチはありますか?
..フレドリック
アプリを完成させ、デプロイしたいと考えています。しかし、アプリをサービス/デーモンとして実行するにはどうすればよいですか?
Google検索では、いくつかのpythonライブラリを使用したいくつかの異なるアプローチが示され、ねじれ、Pythonスクリプトをサービスとして実行できますか? . しかし、それを行う方法がわかりません。
誰もこれをしましたか?ベストプラクティスのアプローチはありますか?
..フレドリック
アプリケーションをスタンドアロンで実行したい場合 (私が正しく理解している場合)、他の (Web 以外の) アプリケーションと同じように処理できます。
プログラムをバックグラウンドで実行するだけの場合は、デーモン アプリケーションの作成方法を説明し、このトピックについて (コメントで) 適切な議論が行われているこのレシピを読むことができます。
一方、アプリで「システム デーモン」を作成する場合 (すべてのシステムの起動時に開始されます)、シェル スクリプトを使用します。システムの起動スクリプトを作成する方法を確認するには、マシン上の他の起動スクリプトからインスピレーションを得ることができます。python my_app.py &
解決策は、 (起動スクリプトから)バックグラウンドでプログラムを実行し、$!
変数を使用してプロセスの pid を取得し、それをファイルに保存することです。このようにして、読み取りによってプロセスを停止することもできます。 「pid ファイル」を開き、コマンドを使用します (プロセスにkill
a を送信すると、アプリケーションで例外が発生します)。SIGINT
KeyboardInterrupt
編集:
質問のコメントでは、python main.py &
失敗/クラッシュした場合にアプリケーションが再起動しないため、使用は安全ではないと言っていますが、それはシステム上の他のデーモンと同じです (たとえば、Apache がクラッシュした場合、それ自体は再起動しません) )。クラッシュした場合にアプリケーションを再起動する場合は、アプリケーションがまだ実行されているかどうかを定期的にチェックし、必要に応じて再起動する 2 つ目のデーモンを作成する必要があります。
ロギングについては、モジュールを使用して、アプリケーションからスタートアップ スクリプトに出力しstdout/stderr
てリダイレクトするpython main.py &> /path/to/app.log &
か ( )、アプリケーションからロギングを処理することができlogging
ます。
または、Supervisord を使用してデーモン化されたプロセスを簡単に実行および制御し、その stdout/stderr 出力もログに記録できます。
Python スクリプトをデモ化することは、実際には Python をデモ化することです。
root の場合は、GNU screen を使用してその作業を行うことを検討してください。Screen 自体は、通常、デーモン プロセスの構築に関して最も複雑なタスクである端末制御を処理します。
画面を起動し、プログラムを実行し、デタッチし、必要に応じてログアウトすると、デーモンのようなプロセスが残ります。このアプローチは、プログラムが作成中である場合、安定性が低い場合、またはデバッグのために多くの迅速に作成されたメッセージをダンプしている場合に特に効果的です。
ファイルシステムをアンマウントしたり、シグナルハンドルを再プログラムしたりする必要がある場合に備えて、作業ディレクトリを / に変更し、使用されていない記述子を閉じるなど、プログラムをデーモン化する際に注意すべき点がいくつかあります。ただし、ほとんどの条件はinit またはクリーンなログイン セッションからプロセスをデーモン化する場合に満足します。ディレクトリを「/」に変更することを忘れないでください。通常はこれで十分です。
しかし、スクリーンを使用してもクラッシュを乗り切ることはできません。クラッシュは常にプログラマーが対処しなければならないものです。