web-dev-qa-db-ja.com

シャットダウンフックを作成する最良の方法は?

Ubuntuはしばらくの間upstartに依存しているため、システムのシャットダウンまたはリブート時にupstartジョブを使用して特定のアプリケーションを正常にシャットダウンしたいと思います。これらのアプリケーションがシャットダウンされるまで、システムのシャットダウンまたはリブートが停止することが不可欠です。

アプリケーションはときどき手動で開始され、システムのシャットダウン時にスクリプト(これは既に持っています)によって自動的に終了します。 (ほとんどすべての)他のサービスを実行せずにアプリケーションを確実に終了することはできないため、残りのシャットダウンが始まる前にアプリケーションを終了する必要があります。

シャットダウン時にトリガーされるupstartジョブによってこれを解決できると思いますが、どのイベントをどのように使用するべきかはわかりません。これまでのところ、次の(部分的に矛盾する)ステートメントを読みました。

  • Upstartには一般的なシャットダウンイベントはありません
  • ジョブ定義でstart on starting shutdownのようなスタンザを使用します
  • ジョブ定義でstart on runlevel [06S]のようなスタンザを使用します
  • ジョブ定義でstart on starting runlevel [06S]のようなスタンザを使用します
  • ジョブ定義でstart on stopping runlevel [!06S]のようなスタンザを使用します

これらの推奨事項から、次の質問が発生します。

  • Ubuntuの新興企業に一般的なシャットダウンイベントはありますか?
  • 「シャットダウンフック」を実装する推奨方法は何ですか?
  • イベントのランレベル[x]がトリガーされるのはいつですか。これはランレベルに入ったときですか、それともランレベルに入ったときですか?
  • start on starting runlevel [x]start on stopping runlevel [x]などを使用できますか?
  • 私の問題の最善の解決策は何ですか?

どうもありがとうございました

9
Binarus

startingrunlevelは別々のイベントなので、意味のあるstarting runlevel Nとは言えません。

runlevel Nイベントは、ランレベルの開始時に発生します。 start on runlevel Nの場合、タスクはエントリ時に実行されます。ランレベルへのエントリが完了したときに実行する方法はrun on started rc RUNLEVEL=Nです。

私が理解しているように、あなたが望むことをするためにはstart on runlevel [06S]が必要です。理論的には、他の何かが停止する前に実行する必要があります。より細かく制御するには、start on stopping Apache or stopping mysql or ...を使用して、タスクがシャットダウンされる前にタスクが実行されるようにします。


ランレベル5をSに変更するために編集されました。

2
geekosaur

ジョブの停止中にシャットダウンの進行を停止するには、これを使用します。

stop on starting rc RUNLEVEL=[016]

「shutdown」と入力したときに最初に発生するのは、tunlevel 0が出力されるためです。 rcはランレベルで開始され、停止->開始からの移行は、状態を変更する必要があるジョブがその状態を完了するまで完全にブロックされます。

プロセスがSIGTERMに迅速に応答することを確認する必要があります。 5秒以内に応答しない場合、upstartはSIGKILLを送信します。 「kill timeout X」でそれを上げることができます。

そこにある1は少し注意が必要です。その時点でランレベル[2345]で開始するものが含まれていることを確認する必要があります。幸いなことに、これを推奨される通常のスタートにするために多くの作業が行われました

start on runlevel [2345]

また、場合によっては、ネットワークが停止するまで実行を続ける必要があるものもあります(dbus/network-managerなど)。そのために

stop on deconfiguring-networking

これは、シャットダウンの後半に発行されるイベントで、これを使用するジョブが状態の遷移を完全に完了するまでブロックされます。

2
SpamapS

Geekosaur、ご協力ありがとうございました。

それまではstart on runlevel [016]メソッドを試しましたが、うまくいきませんでした。その理由は理解できたと思います。

ジョブは実際に開始されましたが、シャットダウンプロセスはジョブのタスクが完了するまでブロックされていません。イベントstartingstoppingは、ジョブ定義で他のジョブをブロックするために使用できる唯一のイベントであり、これがUpstartのマニュアルが伝えようとしていることだと思います。したがって、ランレベルイベントを使用しても、他のジョブやシャットダウンプロセスがブロックされることはありません。したがって、それは私の目的には無意味です。

代わりに、2つの可能性があるようです。

  1. 提案の1つに従って、各アプリケーションが必要とするすべてのジョブを見つけ、そのようなスクリプトの開始イベントにすべてを含めます。

    start on stopping job1 or stopping job2 or ...
    

    これは非常に多くの作業であるため、ジョブリストをダンプしてsedを実行し、通常システムで実行されているallジョブを含むジョブの開始スタンザを自動的に生成することを真剣に考えています。

    利点は、誰かが前提条件の1つを手動で停止した場合でも、ランレベルの変更/シャットダウン/再起動によって停止するのではなく、それぞれのアプリケーションがシャットダウンされることです。

  2. システムの再起動/シャットダウン時に最初に停止する1つのジョブを見つけ(このジョブを「FirstJob」と呼びます)、そのジョブを次のようなスタンザで使用します。

    start on stopping FirstJob
    

    主な欠点は、そのようなジョブが存在するかどうか、そしてそのジョブが本当に依存するかどうかわからないことですall反射アプリケーションが実際に依存する他のジョブ(「他のジョブに依存する」この場合は、「他のジョブが停止し始める前に完全に停止する」という意味です。

2つの可能性のどちらが良いのか分かりません...

0
Binarus