概要
メンテナンスなどで、指定する時刻にLinuxサーバを停止・再起動したいときは割合にあります。
そこで、そんなスクリプトです。
スクリプト内容
- server_shutdown.sh
#!/bin/bash
# メッセージを表示して日付を入力
read -p "このサーバを停止・再起動する日付をyyyymmdd形式で入力してください: " input_date
# メッセージを表示して時刻を入力
read -p "このサーバを停止・再起動する時刻をhhmm形式で入力してください: " input_time
# メッセージを表示して再起動か停止かを入力
read -p "再起動は1、停止は2を入力してください(空エンターは1): " restart_option
restart_option=${restart_option:-1} # デフォルトは再起動(1)
# 日付と時刻を結合
scheduled_datetime="${input_date} ${input_time}"
# オプションに応じてコマンドを設定
case $restart_option in
1)
action="再起動"
;;
2)
action="システム停止"
;;
*)
echo "無効なオプションが選択されました。スクリプトを終了します。"
exit 1
;;
esac
# 確認メッセージを表示して、実行の可否を確認
read -p "$(date -d "$scheduled_datetime" '+%Y/%m/%d %H:%M') に$action します。よろしいですか?(y/n): " confirmation
if [ "$confirmation" == "y" ]; then
# 指定した日時まで待機し、処理をバックグラウンドで実行
(sleep $(( $(date -d "$scheduled_datetime" '+%s') - $(date '+%s') )) && {
echo "システムに常駐し、指定日時に$action を行います。"
if [ $restart_option -eq 1 ]; then
shutdown -r now
elif [ $restart_option -eq 2 ]; then
shutdown -h now
fi
}) &
disown # バックグラウンドプロセスをデタッチ
echo "処理をバックグラウンドで実行しました。プロンプトに戻ります。"
else
echo "操作をキャンセルしました。"
fi
作成後、
sudo chown root:root server_shutdown.sh
として所有者をrootに変更。その後、
sudo chmod 744 server_shutdown.sh
で、rootのみに実行権を付与します。
実行時の動き
sudo bash server_shutdown.sh
このサーバを停止・再起動する日付をyyyymmdd形式で入力してください: 20240216
このサーバを停止・再起動する時刻をhhmm形式で入力してください: 0215
再起動は1、停止は2を入力してください(空エンターは1): 1
2024/02/16 02:15 に再起動 します。よろしいですか?(y/n): y
処理をバックグラウンドで実行しました。プロンプトに戻ります。
と、プロンプトが出て指定時刻にサーバーの再起動/停止を行います。
動きを止めたいとき
バックグラウンドで処理が走っているので、プロセスを確認して止めます。
- プロセス確認
ps aux |grep server_shutdown
root 2202 0.0 0.0 11020 1528 ? S 16:32 0:00 bash server_shutdown.sh
2202のように、PIDを確認します。
- プロセス停止
sudo kill 2202
PIDに停止シグナルを送り、処理を止めます。
- プロセス確認
ps aux |grep server_shutdown
該当するバックグラウンドの処理がなければ大丈夫です。