コンピュータがシャットダウンまたは再起動される前に実行したいスクリプトがありますが、パラメータではなく引数でのみ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
魅力のように動作しますが、マシンを停止するとなぜ動作しないのか混乱します。start
stop
ここで私はどこで間違っていますか?私は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」があります。これは、スクリプトを実行するアイテムの親サービスです。