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


9

Ubuntuはしばらく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]
  • 私の問題に最適な解決策は何ですか?

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

回答:


2

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に変更するように編集されました。


1
また、顕著なstartupイベントがある唯一の理由は、「ポンプを準備する」ために何かが必要であるということです。その後、1つの特権イベントが送信されると、それ以外のすべてがによってトリガーされるジョブとタスクによって定義され、定義されstartupます。単一のshutdownイベントが存在しないことに関しては、それがshutdown意味を持つには多すぎる種類があります。実行する必要のあるジョブに直接依存する方がよい。
ギーコサウルス2009年

どうもありがとうございました。私の質問に答えて問題を解決するので、私はあなたの返信を感謝しています。それでも、追加の質問/コメントがあります(ただし、これは問題とは関係ありません)。AFAIK、ランレベルの概念を完全に置き換えることが新興企業の目標です。グローバルシャットダウンフックを取得するためにランレベルに依存する必要があるという事実は、この目標と矛盾します。新興企業はそのようなイベントを紹介する必要があると思います。私は本当に必要な仕事に頼る方が良いことをはっきりと理解していますが、一方で私の場合、それは仕事の束です...続き...
Binarus

(ほぼすべてが実行されている)、そしてボックスで実行されているプロセス(ps -Alf)とこれらのプロセスを制御しているジョブとの関係を見つけることを敢えて考えようともしません。確かに1対1の関係はありません。どのプロセスにも関連しないジョブ(ネットワークの構成など)があり、いずれにしても、特に手動で開始する場合は、ジョブに関連しない十分なプロセスがあると思います。
オリ

Upstartはハードコードされたランレベルを置き換えました。私が判断できる限り、ランレベルのコンセプトはなくなることはなく、ユーザースペースで定義されているだけです。このような長期について心配している場合は、実行on stopping servicea or stoping serviceb or ...する必要があるすべてのサービスに対して実行するという私の最後の提案を使用する必要があります。
ギーコサウルス

いくつかの不正確さの場合は-1。完全に、これは実際には機能しません。開始されたrcでの停止RUNLEVEL = [016]は、frun 'stop on runlevel [016]'と同じです。これは、どちらのイベントもシャットダウンの進行を妨げないためです。「実行」が有効でないため、無効な構文もあります。全体として、これは単に問題を混乱させるだけで、実際には役に立ちません。遅くなってすみません!古い回答を確認するだけです。
SpamapS

2

ジョブの停止中にシャットダウンが進行しないようにするには、これを使用する必要があります。

stop on starting rc RUNLEVEL=[016]

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

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

その1は少しトリッキーです。開始時にランレベル[2345]で開始するものが含まれていることを確認する必要があります。これにより、シングルユーザーモードのメンテナンスのためにダウンしているユーザーが再びジョブを開始できるようになります。幸いなことに、これを提案された通常の開始にするために多くの作業が行われました

start on runlevel [2345]

また、場合によっては、ネットワークがダウンするまで実行を継続する必要があります(dbus / network-managerなど)。そのためにあなたが欲しい

stop on deconfiguring-networking

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


もしかしてstart on starting ... シャットダウンフックを停止させても意味がありません。 start on starting rc RUNLEVEL=[016]はるかに理にかなっています。そして、おそらくtask他のものが実行される前に完了できることを確実にするためにそこに投入されます。
Tejay Cardon

0

ギーコサウルス、ご協力ありがとうございます。

その間、私はこのstart on runlevel [016]方法を試しましたが、うまくいきませんでした。その理由は理解できたと思います。

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

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

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

    start on stopping job1 or stopping job2 or ...
    

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

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

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

    start on stopping FirstJob
    

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

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


sedがあなたの立場にあるなら、私は今スクリプトをしているでしょう。
geekosaur 2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.