web-dev-qa-db-ja.com

update-rc.dを使用してシャットダウン専用スクリプトを作成する

標準のRaspbianディストリビューションを実行しているRaspberryPiがあります。シャットダウンシーケンスの最後に実行する必要があるこの小さなCプログラムがあります。 Raspberryボードへの電力を遮断するように指示するために、GIPO出力で2つの論理的な高パルスを電源に送信するだけです。シャットダウンスクリプトは、システムの電源がオフになっている場合にのみ呼び出す必要がありますが、PIの再起動または起動時には呼び出さないでください。

私はこれを行うためにupdate-rc.dを使用しようとして失敗しました。 update-rc.dのドキュメントを理解する方法は、次のとおりです。

  1. 実行可能ファイル(poweroff.bin)をコピーし、/ sbinにコピーして、必要なアクセス許可とLSBヘッダーを付与します。

    #!/bin/sh
    ### BEGIN INIT INFO
    # Provides: poweroff
    # Required-Start:
    # Required-Stop:   $all
    # Default-Start:
    # Default-Stop:      0
    # Short-Description: Power off.
    # Description:       Send a power off signal to the PM board.
    # X-Interactive:     false
    ### END INIT INFO
    
    /sbin/poweroff.bin
    
    exit 0
    
  2. /etc/init.dにpoweroffというスクリプトを作成します

  3. コマンドSudoupdate-rc.d poweroff stop 99 0を実行します。

これにより、次のスクリプトが生成されます。/etc/rc0.d/K99poweroffは、システムが停止している場合にのみ/sbin/poweroff.binを呼び出します。

私は3つの質問があります:

  1. Sudo update-rc.d poweroff stop 99 0 .を実行すると、/etc/rc0.d/K01poweroffというスクリプトが作成されるだけです。私は何が間違っているのですか? 99はどうなりましたか?
  2. 実行レベル0での開始オプションと停止オプションの重要性は何ですか?このスクリプトはK99またはS99のどちらにする必要がありますか?実行レベル0の開始スクリプトにはほとんど意味がないようです。
  3. ランレベル0はシャットダウン時にのみ使用されますか?つまり、「shutdown -r now」を実行すると、コンピューターは実行レベル0に送信されてから、実行レベル6に戻りますか?
2
os x nerd

要求された番号付けは、依存関係ベースのメタ初期化システムでは無視されます。あなたは間違った提供をしています!重要な手がかりは別のスクリプトからです。 umountrootを見てみましょう:

### BEGIN INIT INFO
# Provides:          umountroot
# Required-Start:
# Required-Stop:
# Should-Stop:       halt reboot kexec
# Default-Start:
# Default-Stop:      0 6
# Short-Description: Mount the root filesystem read-only.
### END INIT INFO

Should-Stop行を詳しく見てみましょう。電源オフではなく、停止に依存することに注意してください。これは、debianのhaltスクリプトを見ると明確にわかります。

### BEGIN INIT INFO
# Provides:          halt
# Required-Start:
# Required-Stop:
# Default-Start:
# Default-Stop:      0
# Short-Description: Execute the halt command.
# Description:
### END INIT INFO

更新スクリプトはまだK99とは呼びませんが、非常に複雑な依存関係のセットがない限り、おそらくK15のようなものと呼ぶことに注意してください。ただし、provides行を停止に変更すると、機能するはずです。

0
hildred
  1. シャットダウンスクリプトには逆の番号が付けられているため、逆の順序で実行されるため、99ではなく1が必要になる可能性があります。
  2. いくつかの観点から、必要に応じてランレベル0でサービスを開始できますが、実際には開始したくありません。 (スクリプトを開始として実行することもできますが、どちらが最初に実行されるか、開始スクリプトと停止スクリプトのどちらが実行されるかは思い出せません。)ランレベル0で呼び出されるほとんどのスクリプトは他のランレベルでも使用されるため、停止するだけです。 Snnスクリプトは、ランレベル0の開始で呼び出されます。
  3. はい・いいえ。または、自動電源管理の前にもっと冗長にするために、ランレベル0は単なる別のランレベルでした。シャットダウン時に最後に見たのは、電源スイッチを切り替えるプロンプトでした。その時点でランレベルの変更を通知できれば、おそらくシステムを復旧させることができます。フルパワー管理を備えたコンピューターでは、ランレベル0に到達する最後のステップとしてコンピューターの電源がオフになります。ランレベル6も同様ですが、別個のランレベルであり、ランレベル0と6を切り替えるための標準的な使用例はありません。通常の使用にランレベル0と6のいずれかを使用し、シャットダウンを委任し、他のランレベルに再起動するディストリビューションがあります。)
0
hildred