none
サービスの起動順序について RRS feed

  • 質問

  • 初めて質問させていただきます。

    バックアップ時に使用しているとあるアプリケーション関連のサービスを手動で停止して、
    バックアップが終了したら手動でサービスを起動するバッチを作成する必要があります。

    OS起動時にOSがサービスを起動する順番は、
    services.mscから該当のサービスのプロパティを起動して、依存関係タブの設定に基づいてサービスを順番に起動しているという認識です。
    (または、HKEY_LOCALMACHINE¥SYSTEM¥CurrentControlSet¥Services 以下の情報。)
    この際、「依存関係なし」になっているサービスはどのタイミングで起動されるのでしょうか。

    ①OS起動時に最初に起動される。
    ②OS起動時に最後に起動される。
    ③「依存関係なし」になっているサービスは、タイミング関係なく起動される。

    上記のいずれかだと思うのですが、バッチの中で「依存関係なし」になっているサービスの起動・停止の対応に困っております。
    (アプリケーションのドキュメントにサービスの起動順序についての記述がないため、
    OS起動時に起動している順序でサービスの起動・停止を行おうと思っているのですが、
    「依存関係なし」のサービスを順序に関係なく起動・停止させればいいのか、依存関係が設定されているサービスの前後どちらかに起動・停止させないとダメなのかが分かりません。)

    なお、環境はWindows 2008 R2 SP1を使用しております。

    ご教示お願いいたします。

    2013年2月1日 22:34

回答

  • (アプリケーションのドキュメントにサービスの起動順序についての記述がないため、
    OS起動時に起動している順序でサービスの起動・停止を行おうと思っているのですが

    単純な話、まずアプリケーションの製造元に聞いてはダメなんでしょうか? 一番確実だと思うんですが・・・
    ( そのアプリケーションが Microsoft 製品だからフォーラムに聞いているということだったらすいません )

    もしくは、イベント ログのシステム ログに Service Control Manager の イベント ID : 7036 ( 正常起動した場合 ) が出ていないかを
    確認してもいいかもしれません。サービスが起動したら イベント ログが出力されますので、そこで順番が分かります。

    そして、「依存関係なし」のサービスですが、起動させる順番は決まっています。
    ( 正確には、依存関係の有無だけで起動順が決まっているわけではなく、いくつかのルールによって決まっています。)

    まず最初に、HKLM\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder キーの List の値の格納順で、そのサービス グループに所属するサービスが起動されます。
    各サービスがどのサービス グループに所属しているかは、HKLM\SYSTEM\CurrentControlSet\Services 以下に列挙されている各サービス のキーにある、
    Group 値に記述されています。

    同じサービス グループに複数のサービスが所属している場合は、そのグループ内にて、サービス名のアルファベット順で起動されます。

    アルファベット順にサービスを起動している際に、起動しようとしているサービスが何か別のサービスに依存している場合は、
    依存関係にあるサービスを確認し、まだ起動していない場合は先に起動させます。
    スタートアップが手動に設定されているサービスの場合でも、依存関係にある場合はここで起動されます。
    依存しているサービスがさらに何らかのサービスに依存している場合は、スタックのようにに依存関係を遡り起動させていきます。

    サービス グループに所属しているサービスの起動が終了した後、サービス グループに所属していない残りのサービスをアルファベット順に起動させます。
    サービス グループに所属していないというのは、Group 値が無いか、ServiceGroupOrderに記載されていない Group 値が設定されているかのどちらかですが、
    この 2 種類の順序は区別されません。

    実際にはエラー処理やサービスの種類などの条件によっても起動順が決められるため、
    アルファベット順が前後することになりますが、基本的なルールはこのようになっています。

    2013年2月3日 8:50

すべての返信

  • ご質問の回答としては、
    ③「依存関係なし」になっているサービスは、タイミング関係なく起動される。
    になるかと思います。
    どのタイミングで起動させても動作に影響がないため、依存関係がないという理解で良いと思います。
     
    蛇足ですが、サービスの起動順序については、依存関係に基づいて順序立てて開始している訳ではないと理解しています。
    イメージ的にはほとんど同時にサービスを開始していって、自身が起動するタイミングで、依存しているサービスが開始または開始中でなければそのタイミングで開始させ、依存しているサービスがすべて開始後に自身も起動する、というような動きであるため、結果として依存関係の順になっている、という認識です。

     

    2013年2月2日 10:35
  • (アプリケーションのドキュメントにサービスの起動順序についての記述がないため、
    OS起動時に起動している順序でサービスの起動・停止を行おうと思っているのですが

    単純な話、まずアプリケーションの製造元に聞いてはダメなんでしょうか? 一番確実だと思うんですが・・・
    ( そのアプリケーションが Microsoft 製品だからフォーラムに聞いているということだったらすいません )

    もしくは、イベント ログのシステム ログに Service Control Manager の イベント ID : 7036 ( 正常起動した場合 ) が出ていないかを
    確認してもいいかもしれません。サービスが起動したら イベント ログが出力されますので、そこで順番が分かります。

    そして、「依存関係なし」のサービスですが、起動させる順番は決まっています。
    ( 正確には、依存関係の有無だけで起動順が決まっているわけではなく、いくつかのルールによって決まっています。)

    まず最初に、HKLM\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder キーの List の値の格納順で、そのサービス グループに所属するサービスが起動されます。
    各サービスがどのサービス グループに所属しているかは、HKLM\SYSTEM\CurrentControlSet\Services 以下に列挙されている各サービス のキーにある、
    Group 値に記述されています。

    同じサービス グループに複数のサービスが所属している場合は、そのグループ内にて、サービス名のアルファベット順で起動されます。

    アルファベット順にサービスを起動している際に、起動しようとしているサービスが何か別のサービスに依存している場合は、
    依存関係にあるサービスを確認し、まだ起動していない場合は先に起動させます。
    スタートアップが手動に設定されているサービスの場合でも、依存関係にある場合はここで起動されます。
    依存しているサービスがさらに何らかのサービスに依存している場合は、スタックのようにに依存関係を遡り起動させていきます。

    サービス グループに所属しているサービスの起動が終了した後、サービス グループに所属していない残りのサービスをアルファベット順に起動させます。
    サービス グループに所属していないというのは、Group 値が無いか、ServiceGroupOrderに記載されていない Group 値が設定されているかのどちらかですが、
    この 2 種類の順序は区別されません。

    実際にはエラー処理やサービスの種類などの条件によっても起動順が決められるため、
    アルファベット順が前後することになりますが、基本的なルールはこのようになっています。

    2013年2月3日 8:50
  • a_pierrotさん、yottun8さん

    詳細な解説ありがとうございました。

    Microsoft製品では無いのですが、現在サポート契約をしていない関係で
    アプリケーション製造元に問い合わせすることが出来ない状態です。
    (最終的には、サポート契約をする予定です。)

    サービス グループに所属していないサービスだったため、
    イベントのシステムログの起動順を参考に検証を行おうと思っています。

    大変勉強になりました。
    本当にありがとうございました。

    2013年2月4日 14:41