2017/8/24
@taramさんからスクリプトがDRYとの指摘や、shutdownコマンドのオプションをフックする方法を教えていただいたので内容を修正しました。
概要
ターミナルをたくさん開いてて対象サーバと別のサーバをうっかりリブートしてしまい泣きながら報告書を書いたことがある人向けです。事故防止にお役立てください。
reboot
やpoweroff
コマンドを実行した際にいきなりプロセスが開始されるのではなく、サーバのホスト名を確認するよう促します。
スクリプトを作ってコマンドのエイリアスにするだけです。
スクリプト
reboot/poweroffコマンド用
confirm_shutdown.sh
#!/bin/bash
confirm_shutdown() {
COMMAND=$1 #yesの場合に実行されるコマンド。
ACTION=${2:-$1} #メッセージに出力する動作の名前。省略すると$COMMANDと同じ
echo "You will $ACTION << `hostname` >>, Are you sure? (yes or no)"
read ANS1
if [ "${ANS1}" = 'y' -o "${ANS1}" = 'yes' ]; then
echo 'Really? (yes or no)'
read ANS2
if [ "${ANS2}" = 'y' -o "${ANS2}" = 'yes' ]; then
echo "${ACTION^} `hostname`."
exec $COMMAND
fi
fi
echo "${ACTION^} cancelled."
}
shutdownコマンド用
shutdown
コマンドはオプションを使うことがほとんどなのでそれをフックします。
shutdown.sh
#!/bin/bash
source /<PATH>/confirm_shutdown.sh
while getopts :rhHP OPT; do
case $OPT in
r)
ACTION="reboot"
;;
h|H|P)
ACTION="shutdown"
;;
*)
;;
esac
done
if [ -n "$ACTION" ]; then
confirm_shutdown "shutdown $*" $ACTION
else
shutdown "$@" #shutdown -cなどは普通に実行
fi
-
while getopts :rhHP OPT
はオプションに'r' 'h' 'H' 'P'いずれかの文字列があればOPT
に代入します。 - オプションが'r'の場合は再起動、'h' 'H' 'P'はシャットダウン、それ以外は最後の
else
のところでそのまま実行。 -
$*
、$@
は引数全部。前者は引数すべての1つの文字列として扱い、後者は変数ごとに区切られた文字列として扱います。shutdown -r now
など複数のオプションをフックするためですね。
.bashrcへaliasを記載
.bashrc
(中略)
source /<PATH>/confirm_shutdown.sh
alias reboot="confirm_shutdown reboot"
alias poweroff="confirm_shutdown poweroff shutdown"
alias shutdown='/<PATH>/shutdown.sh'
<PATH>
は自分の環境にあわせて修正しましょう。
source
コマンドで.bashrc
を読み込んで有効にすること。
試してみる
poweroff
を実行すると
You will shutdown <ホスト名>, Are you sure? (yes or no)
と表示されるのでyes(またはy)
Really? (yes or no)
yes(またはy)を入力しEnterを実行するとpoweroffが実行されます。rebootも同じ流れです。
この世から事故がなくなりますように。