再起動すると、init.d スクリプトに "stop" が送信されません。

再起動すると、init.d スクリプトに "stop" が送信されません。

コンピュータがシャットダウンまたは再起動される前に実行したいスクリプトがありますが、パラメータではなく引数でのみstartトリガーされるstopため、これは狂います。

私のシステムには次のシンボリックリンクがあります。

/etc/rc0.d/K01init.sh
/etc/rc1.d/K01init.sh
/etc/rc2.d/S99init.sh
/etc/rc3.d/S99init.sh
/etc/rc4.d/S99init.sh
/etc/rc5.d/S99init.sh
/etc/rc6.d/K01init.sh

どちらも同じスクリプトを指します。/etc/init.d/init.sh。他のスレッドに基づいて.shサフィックスなしで試してみましたが、何も変更されませんでした。

/etc/init.d/init.sh

#!/bin/sh
### BEGIN INIT INFO
# Provides:          init.sh
# Required-Start:    $all
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: xxx
# Description:       xxx
### END INIT INFO

if [ "$1" = "start" ]; then
  echo "log message"
  //do stuff
fi

echo "$1"

if [ "$1" = "stop" ]; then
  echo "log message"
  //do stuff
fi

exit 0

stopスクリプトは起動時にうまく実行されますが、ブロックで実行する必要があるクリーンアップは実行されないと文句を言います。ログをエコーすると、ログのみが$1常に表示されますstart。これは、OSが明らかにstop私のスクリプトにコマンドを送信しないことを意味します。引数を使用してコマンドライン()でスクリプトを実行するとsudo /etc/init.d/init.sh stop魅力のように動作しますが、マシンを停止するとなぜ動作しないのか混乱します。startstop

ここで私はどこで間違っていますか?私はUbuntu 18.04を実行しており、現在の実行レベルは5です(しかし、ここでは約0と6でなければならないので関係ありません)。興味深いことに、スクリプトに追加して実行時に実際のランレベルを確認してみましたが、echo "$(who -r)"ログには何も出力されません!

sudo reboot該当する場合: /rebooting 配信について話しています。sudo systemctl reboot そしてAzure GUI (仮想マシン) で Azure の再起動メカニズムが異なるかどうかはわかりませんが、どちらの方法も機能しません。

答え1

以前のランレベルと初期化システムを置き換えたsystemdについて知っておく必要があります。

systemdはまだ古いinit.dスクリプトを実行できますが、systemdを学び、systemdサービスファイルを作成することをお勧めします。ここをまず見てくださいsystemdは/etc/init.dスクリプトをどのように使用しますか?ここで、systemdのinit.d処理の説明を見つけることができます。

私の考えでは、systemdが実行されているとは思わないので、スクリプトが終了時に実行されないようです。たぶんスクリプトが実行されてから終了する可能性があります。永遠に実行されるわけではありません。 systemdはこれを検出し、スクリプトは実行されません。存在する場合は実行されません。したがって、ブロックするものがないため、systemdはそれをブロックしません。

systemctl コマンドを使用してサービスの状態を確認し、情報を表示します。systemctlスクリプトを入力して見つけます。また試すことができます

systemctl status init.sh
systemctl start init.sh
systemctl stop init.sh
systemctl restart init.sh

これは、以前のinit.dスクリプトではなく実行される実際のコマンドです。

systemdに移行することをお勧めします。サービスユニット構成の表示(https://www.freedesktop.org/software/systemd/man/systemd.service.html)。おそらく最高のサービスタイプはですoneshot。ここで例を見つけることができます。シャットダウンする前にsystemdを使用してスクリプトを実行する方法は?。 examplelpeによると、次のようなものを生成する必要があります/etc/systemd/system/init.sh.service

[Unit]
Description=init.sh

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/etc/init.d/init.sh start
ExecStop=/etc/init.d/init.sh stop

[Install]
WantedBy=multi-user.target

次に、systemdでサービスを有効にします。

sudo systemctl enable init.sh.service

サービスの開始時点をより正確に制御するには、を追加できますAfter=Before=他にも多くのオプションがあります。

答え2

Required-Stop:私は問題が価値の欠如だと思います。停止時にロガーやディスクなど他のものを実行する必要はないと言います。そのRequired-Start:行に一致するようにパラメータを追加します。

あなたの名前はもっと説明的でなければなりません。標準サービス「init」があります。これは、スクリプトを実行するアイテムの親サービスです。

関連情報