概要
「要件は定義できるけどそれを実行する術を知らない」とき、ChatGPTは非常に有用です。
そこで、以下のスクリプトを書いてもらいました。
ChatGPTへの要件
- 指定時刻にはLinuxサーバのシャットダウンを行いたい。
- 検証機なので、副系への切り替えなどは考慮しない。
- 後々を考えて、スクリプトとして残し、思い立ったときには実行できるようにしたい。
ということで、以下の質問をしました。
計画停電に備え、指定時刻にLinuxサーバのシャットダウンをしたいと思います。
そこで、以下のシェルスクリプトを書いてください。
- 対話式で日付(YYYYMMDD)と時刻(HHMM)の入力プロンプトを出す
- 形式が違う場合はエラーを出し、再度の入力を求める
- 入力後、指定日時を表示しy/nで確認
- 受付後、バックグラウンドで常駐
- 指定時刻になったらシャットダウンを行う
ChatGPTからの回答
以下が、示したスクリプトです。
- スクリプト名:shutdown.sh
#!/bin/bash
# 1. 日付と時刻の入力プロンプトを出す
read -p "シャットダウンする日時を指定してください(YYYYMMDD HHMM): " shutdown_time
# 2. 形式が違う場合はエラーを出し、再度の入力を求める
until [[ $shutdown_time =~ ^[0-9]{8}\ [0-9]{4}$ ]]; do
echo "日付と時刻の形式が正しくありません。再度入力してください。"
read -p "シャットダウンする日時を指定してください(YYYYMMDD HHMM): " shutdown_time
done
# 3. 入力後、指定日時を表示しy/nで確認
echo "指定された日時は ${shutdown_time:0:4}/${shutdown_time:4:2}/${shutdown_time:6:2} ${shutdown_time:9:2}:${shutdown_time:11:2} です。"
read -p "この日時でシャットダウンを行いますか? (y/n): " confirm
# 4. 受付後、バックグラウンドで常駐
if [[ $confirm =~ ^[Yy]$ ]]; then
shutdown_sec=$(date -d "${shutdown_time:0:8} ${shutdown_time:9:4}" +%s)
current_sec=$(date +%s)
if [[ $shutdown_sec -lt $current_sec ]]; then
echo "指定された日時は過去のため、シャットダウンは行われません。"
else
wait_sec=$(( shutdown_sec - current_sec ))
echo "シャットダウンまでの待機時間は $wait_sec 秒です。"
sudo sleep $wait_sec && sudo shutdown -h now &
echo "シャットダウンを開始しました。"
fi
else
echo "シャットダウンを中止しました。"
fi
動作確認
上記スクリプトを対象サーバに保存後、以下の処理を行いました。
sudo chown root:root shutdown.sh
# shutdownコマンドは管理者ユーザのみ実行権限があるので所有者もrootにします
sudo chmod 744 shutdown.sh
# rootのみに実行権限を与えます
sudo bash shutdown.sh
と入力後、想定通りYYYYMMDD形式とHHMM形式で日付と時間を入力するよう求められました。なので、30分後などの日時を指定して実行します。
バックグラウンドで実行されているか、以下を確認しました。
ps aux |grep shutdown
# 下記の表示を確認。
# root 107296 0.0 0.0 10536 280 pts/0 S 14:27 0:00 bash shutdown.sh
その後、実行時間になってシャットダウンを確認。
動作確認日
2023/03/14
コメントを残す