Linux備忘録6:再起動の処理を含めたシェルスクリプト

2本のシェルスクリプト(test1.sh,test2,sh)があって、再起動後にtest2.shが実行されるように記述する。

⇒実行環境、CentOS8(Kernel Ver:4.18.0-147.8.1.el8_1.x86_64)

 

【フロー】

<test1.sh> 処理実行

再起動

OS起動と同時に<test2.sh>処理実行

#あまり深く検証出来ていない。OS起動のタイミングで処理されるみたいだから、サービス関連の処理とかだと、ちゃんと実行されるのかどうか不明。

⇒単純なファイルコピー、ユーザー追加などは問題無く出来た。

 

【実現方法】

test1.shの再起動直前の処理に、/etc/rc.d/rc.localに実行したいスクリプト(test2.sh)のファイルパスを追記、rc.localに実行権限を付与する。

⇒/etc/rc.localは上記ファイルのシンボリックリンクとなっている。権限付与は元ファイルに必要。

##### 注意 ######

この方法は推奨方法ではありません。

rc.localでも以下コメントが記載されております。

>このファイルは互換性のために追加されています

>独自のシステムサービスまたはudevルールを作成することをお勧めします

 

【参考スクリプト例】

⇒変更したrc.localをバックアップから戻す処理と、結果確認としてログを出力する処理を入れてます。

 

<test1.sh>

#!/bin/bash

RC=/etc/rc.d/rc.local
BK=/etc/rc.d/BK_rc.local

cp -a ${RC} ${BK}
chmod +x ${RC}
sed -i "$ a /root/test2.sh yamaga kituki" ${RC}

read -p "Reboot OK?" ⇒ 再起動前に一時停止
systemctl reboot

 

<test2.sh>

#!/bin/bash

LOG=/root/test.log

touch ${LOG}
pwd >> ${LOG}
echo "$0" >> ${LOG}
echo "$#" >> ${LOG}
echo "$1" >> ${LOG}
echo "$2" >> ${LOG}

echo "END" >> ${LOG}

mv /etc/rc.d/BK_rc.local /etc/rc.d/rc.local
ls -l /etc/rc.d/rc.local >> ${LOG}

⇒補足ですが、<test2.sh>は今回の場合、ファイル名実行ですので、事前の実行権限付与が必要です。

 

<test.log>⇒確認ログ

  # cat test.log

⇒ #rc.localで実行した場合、カレントディレクトリが</>になります。
/root/test2.sh

yamaga ⇒ #引数1
kituki ⇒ #引数2
END
-rw-r--r-- 1 root root 474 5月 31 23:04 /etc/rc.d/rc.local ⇒ #ファイルリストア後の権限確認。

 

【まとめ】

・再起動後のシェルスクリプト実行はrc.localファイルに行追加 + 実行権限付与。

・引数も記載することで、シェルに利用できる。

・その場合、カレントディレクトリは</>になる。