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.localcp -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
2
yamaga ⇒ #引数1
kituki ⇒ #引数2
END
-rw-r--r-- 1 root root 474 5月 31 23:04 /etc/rc.d/rc.local ⇒ #ファイルリストア後の権限確認。
【まとめ】
・再起動後のシェルスクリプト実行はrc.localファイルに行追加 + 実行権限付与。
・引数も記載することで、シェルに利用できる。
・その場合、カレントディレクトリは</>になる。