web-dev-qa-db-ja.com

Debianのシャットダウン/再起動時に最初にスクリプトを実行することは可能ですか?

私は現在、スクリプトを登録しようとしています(/ etc/init.dにあります)このスクリプトがシャットダウン/再起動時に最初のスクリプト/プログラムとして実行されるようにします(実行レベル0または6)に変更します。

update-rc.d stop_servers stop 0 0 6 .を使用して、これら2つのランレベルのスクリプトを登録しました。そこに正しく登録されていますが、名前はK01stop_serversです。これにより、スクリプトは最初のスクリプトとして実行されなくなります。
基本的にすべてがまだ実行されている必要があります。だから私はそれを最初にしたいのです。
つまり、Apache、mysql、および(s)ftpサーバーを実行し、Javaはまだ完全に機能している必要があります。

どうすればこれを達成できますか?

スクリプトは次のようになります。

#! /bin/bash

### BEGIN INIT INFO
# Provides:          mc_server_safe_shutdown
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:
# Default-Stop:      0 6
# Description:       Shuts down all Minecraft serves softly
### END INIT INFO

/root/.stop_servers

exit 0
5
BrainStone

やりたいことを行う適切な方法は、必要な依存関係をリストするカスタムinitスクリプトを作成します。そのスクリプト内で、問題のサービスを開始/停止しますスクリプトが呼び出されるかどうかに応じて最初のパラメーターとしてstartまたはstopを使用します。

テンプレートとして/etc/init.d/motdなどの単純なスクリプトから始めることができます。これには、すべてを機能させるためのすべての基本的な部分が含まれているためです。あなたの場合、スクリプトに次のように記述させます

# Required-Stop: $remote_fs $syslog Apache2 mysql

remote_fssyslogfacilitiesを実行する必要があるためです(ただし、これらの機能を提供する正確なサービスは関係ありません) 、具体的には、停止アクションが発行されたときに実行されているApache2およびmysqlservices。 Java自体はサービスではありませんが、それを使用すると、ファイルシステムを含むサービスに依存する可能性があることに注意してください。

Should-StopおよびRequired-Stopは、insserv(8)のマニュアルページで次のように説明されています。

どちらの場合も、スクリプトシステムは、これらのタグを含むスクリプトが停止するまで、これら2つのStopタグによって宣言されたサービスの停止を回避する必要があります。

名前は、サービス初期化スクリプトのProvides(リテラルサービス名、先頭に$記号なし)、および/etc/insserv.conf(施設名、$記号)に由来します。始まり)。

スクリプトを希望どおりに作成したら、update-rc.dを使用するか、insservを使用して直接インストールします。

1
a CVn

シャットダウン時にのみスクリプトを実行する場合は、次のものは必要ありません。

# Required-Start:    $remote_fs $syslog

これは空のままにしておくことができます。

各スクリプトには、Required-StartおよびRequired-Stopディレクティブで使用できる他のスクリプトの名前を定義するProvidesエントリがあります。 2つのフィールドで順序が逆になります。スクリプトの前に何かを開始する必要がある場合は、それをRequired-Startディレクティブに入れる必要があります。ただし、特定のサービスの前にスクリプトを停止する必要がある場合は、そのサービスの名前をRequired-Stopに配置する必要があります。

したがって、あなたの例では、シャットダウン時にApacheとmysqlが終了する前にスクリプトを実行する必要があります。あなたがしなければならないのは、適切なinitファイルのProvidesディレクティブをチェックすることだけです。

$ cat /etc/init.d/Apache2
...
# Provides:          Apache2
...

そして:

$ cat /etc/init.d/mysql
...
# Provides:          mysql
...

ここで、Apache2ディレクティブの下でスクリプトにRequired-Stopmysqlを追加するだけです。

# Required-Stop: Apache2 mysql

Initスクリプトのヘッダーについて詳しく読むことができます ここ 。施設名に関する情報もいくつかあります。たとえば、言及されている$remote_fsおよび$syslog

$ local_fs-すべてのローカルファイルシステムがマウントされます。/var /に書き込むすべてのスクリプトは、すでに$ remote_fsに依存している場合を除き、これに依存する必要があります。

$ network-低レベルのネットワーク(イーサネットカード。PCMCIAの実行を意味する場合があります)

$ named-ホスト名解決(存在する場合)を提供する可能性のあるデーモンが実行されています。たとえば、DNS、NIS +、またはLDAPを照会するデーモン。

$ portmap-RFC 1833(存在する場合)で定義されているSunRPC/ONCRPCポートマッピングサービスを提供するデーモンがすべてリモートで実行されている

$ remote_fs-すべてのファイルシステムがマウントされます。一部のLSBランタイム環境では、/ usrなどのファイルシステムがリモートになっている場合があります。スクリプトにマウントされた/ usr /が必要な場合は、$ remote_fsに依存する必要があります。 $ remote_fsに依存するスクリプトは、$ local_fsに依存する必要はありません。シャットダウン中、sendigsがすべてのプロセスを強制終了する前に実行する必要のあるスクリプトは、$ remote_fsに依存する必要があります。

$ syslog-システムロガーは操作可能です

$ time-システム時刻は、たとえば、ntpやrdateなどのネットワークベースの時刻プログラムを使用するか、ハードウェアのリアルタイムクロックを介して設定されています。 ntpに依存するだけでは、ntpが開始された直後の正確な時刻にはならないことに注意してください。 ntpが実際に時間を調整するまで、通常は数分かかります。また、標準のinsserv.confはhwclockを$ timeとしてリストしているだけであることに注意してください。

$ all-起動シーケンスの最後に、他のすべてのスクリプトの後にスクリプトを開始するためにinsservによってサポートされる機能。これは注文の開始時にのみ機能し、注文の停止には機能しません。 $ allに依存するスクリプトに依存することはできません。

Initスクリプトのヘッダーを変更した後、update-rc.dを実行する必要があります。これにより、ヘッダーに基づいてすべてのスクリプトの正しい順序が設定されます。

# update-rc.d script defaults 
3