システム再起動時のインスタンスジョブの起動

システム再起動時のインスタンスジョブの起動

私はいくつかのサービスを開始するために、upstart インスタンス ジョブを使用しています。ジョブはユーザーごとに 1 つのインスタンスを持つように設計されており、つまり、インスタンス パラメータとしてユーザー名を受け取ります。また、upstart によって再生成されるように構成しました。再生成は機能します。これが私の構成ファイルです。

start on runlevel [2345]
stop on runlevel [06]

normal exit 0

respawn
respawn limit 5 300
instance $user

chdir /home/talha/syncservice/
script
   exec python sync.py $user
end script

問題は、システムの再起動時にこれらのインスタンス ジョブを再開したいということです。当然、前回生成されたインスタンスの内容と数がわからないため、再起動時にすべてのユーザー名をインスタンス パラメータとして渡すことはできません。

Upstart が再起動後もインスタンス ジョブの状態テーブルを永続化できる方法はありますか。何らかの「状態テーブル」があると想定するのは、Upstart が実行中のインスタンス ジョブをすべて追跡していると想定しているからです。クラッシュしたときにどのインスタンスを再起動するかを追跡する状態テーブルがあるはずです。そうでなければ、インスタンス ジョブを再起動できません。したがって、これらのテーブルを再起動後も永続化できれば、問題は解決します。

永続性は何らかの方法で実現できますか? upstart は実行中のジョブをどこに記録しますか? メモリ内だけですか、それともファイル内ですか?

それができない場合は、その節は

start on runlevel[2345]

たとえば仕事には意味もメリットもありません。

答え1

ユーザーのリストをファイルに保存できます (この例では user-sync.list)。ユーザー スクリプトを復元するには、起動時に root によって実行される bash スクリプトで for ループを使用できます。init スクリプトの名前が user-sync の場合:

#!/bin/sh
# /root/restore-user-sync.sh
for user in `cat user-sync.list`; do start user-sync user=$user; done

それを root として crontab に追加します:

$ crontab -e

cron ファイル内:

@reboot /root/restore-user-sync.sh

アクティブ ユーザーのリストの維持は、最も複雑な部分です。Python スクリプトでこれを実行することもできますし、Upstart スクリプトの一部として実行することもできます。

# /etc/init/user-sync.conf

start on runlevel [2345]
stop on runlevel [06]

normal exit 0

respawn
respawn limit 5 300
instance $user

chdir /home/talha/syncservice/

pre-start script
    # if $user doesn't already exist in list, add $user to list
    if ! grep $user user-sync.list; then echo $user >> user-sync.list; fi
end script

script
   exec python sync.py $user
end script

pre-stop script
    # remove line(s) from list that exactly match $user
    sed -i "/\b$user\b/d" user-sync.list
end script

$user の代わりに $USER (現在のユーザー名として自動的に定義されます) を使用できる場合があります。そうでない場合は、upstart スクリプトを呼び出すときに、ユーザー名をパラメーターとして渡す必要があります。

sudo start user-sync user=myusername

答え2

私は Upstart の内部に侵入するのは絶対に避けます。別の方法でこれを行うことができます。

クックブックのインスタンススタンザのセクションこのようなことを行う方法の例がいくつかあります。私は複数のPostgreSQLインスタンスでこのようなことを行っています。これ答え。

ここでの基本的な考え方は、すべてのインスタンス ジョブを開始する「ポニー エンジン」ジョブと呼ばれるジョブを作成することです。この場合、 のサブディレクトリを反復処理する/homeか、サービスを実行するユーザーをリストする別の conf ファイルを保持することができます。ユーザーごとに sync.py インスタンスを開始します。

start on/ はstop onインスタンス ジョブでは役に立たないというのは正しいです。これを「ポニー エンジン」ジョブに移動します。

残念ながら、現在 Linux ボックスにアクセスできませんが、例については前述の回答を参照してください。

関連情報