web-dev-qa-db-ja.com

Daemon vs Upstart for pythonスクリプト

私はモジュールをPythonで記述し、開始したら連続して実行し、他のモジュールを更新する必要がある場合は停止する必要があります。モジュールがクラッシュしたか、実行されていません。

Daemonpstart などのさまざまなテクニックを試していました。

すべての新しいモジュールを通してそのアプローチを使用して、それらを永久に実行し続けるための最良の方法はどれですか?

40
mtariq

Upstartについての言及から、この質問はUbuntuサーバーで実行されているサービスに関するものだと思います。

Ubuntuサーバーでは、スタートアップジョブは、適切なタイミングで起動し、使い慣れたコマンドで停止またはリロードできる常時オンサービスを作成するための最も簡単で便利なオプションです。

Upstartサービスを作成するには、/etc/initに単一のファイルを追加する必要があります。 <service-name>.confと呼ばれます。サンプルスクリプトは次のようになります。

description "My chat server"
author "[email protected]"

start on runlevel [2345]
stop on runlevel [!2345]

env AN_ENVIRONMENTAL_VARIABLE=i-want-to-set

respawn

exec /srv/applications/chat.py

これは、マシンが起動するたびにchat.pyプログラムが起動することを意味します。何らかの理由で死んだ場合、再起動します。二重分岐やコードのデーモン化について心配する必要はありません。それは新興企業によって処理されます。

プロセスを停止または開始する場合は、次のようにします。

service chat start 
service chat stop

名前chatは、.conf内の/etc/initファイルの名前から自動的に検出されます

ここでは、新興企業の基本についてのみ説明します。さらに便利にするための機能は他にもたくさんあります。すべてはman upstartを実行することで利用できます。

この方法は、独自のデーモン化コードを書くよりもはるかに便利です。組み込みのUbuntuコンポーネントの4〜8行の構成ファイルは、コードを安全にダブルフォークし、別のプロセスでそれを監視して消失しないようにするよりもエラーが少なくなります。

Monitは少しニシンです。ダウンタイムアラートが必要な場合は、とにかくseparateサーバーで監視プログラムを実行する必要があります。プロセスを常にサーバーで実行し続けるには、upstartに依存します。次に、サーバーが実際に実行されていることを確認する別のサービスを用意します。ダウンタイムはさまざまな理由で発生します。同じサーバーで実行されているプロセスは、サーバー自体がダウンした場合、正確には何も通知しません。その状態を警告するには、別のマシン(またはpingdomなどのサードパーティプロバイダー)が必要です。

81
aychedee

supervisor を確認できます。できるのは、システムの起動時にプロセスを開始し、シャットダウンするまでそれを維持することです。

最も単純な構成ファイルは次のとおりです。

[program:my_script]
command = /home/foo/bar/venv/bin/python /home/foo/bar/scripts/my_script.py
environment = MY_ENV_VAR=FOO, MY_OTHER_ENV_VAR=BAR
autostart = True
autorestart = True

次に、それを/etc/supervisord/conf.dにリンクし、Sudo supervisorctlを実行してスーパーバイザーの管理コンソールに入り、スーパーバイザーが新しい設定エントリに気づくようにrereadを入力し、updateに新しいプログラムを表示しますstatusリスト。

プログラムを開始/再起動/停止するには、Sudo supervisorctl start/restart/stop my_scriptを実行できます。

8
Maciej Gol

古いスタイルのinitscriptをstart-stop-daemonユーティリティで使用しました。/etc/init.dのskelを見てください

3
eri