機械学習の終了時刻が深夜に及んだ時に、計画的にシャットダウンする必要があったので忘備録として残します。
環境
Ubuntu 18.04
タイムゾーンを日本の時刻に設定
# タイムゾーンを設定
sudo timedatectl set-timezone Asia/Tokyo
# 日付を確認
date
atコマンド と cron
- at
- 未来の日時で1回だけ実行するのに使う。
- cron
- 毎時、日次、月次などの定期的な実行に使える。
本記事では「1.指定時刻にシャットダウンする」方法と「2.特定のプロセスの終了を確認したうえで、終了処理を行う」方法とをまとめます。
1.指定時刻にシャットダウンする。
未来日付で1度だけシャットダウンする場合は、at
コマンドが使える。
at
コマンドは以下のように使用する。
echo "[command]" | at [ 日時 ]
仮に、2019年9月12日 12:30にシャットダウンをするなら、以下のようにすればいい。
echo "sudo shutdown -h now" | at 12:30 09122019
# 実行結果
warning: commands will be executed using /bin/sh
job 3 at Thu Sep 12 12:30:00 2019
上記のように表示されれば、指定した時刻にシャットダウンが実施される。
誤った時刻で設定してしまった場合の対処
予約したコマンドのジョブリストを表示
at -l
# 実行結果
3 Thu Sep 12 12:00:00 2019 a [ user ]
表示されたジョブ番号を指定して、at -d
コマンドを実行
# at -d [ジョブ番号]
at -d 3
2.特定のプロセスの終了を確認したうえで、終了処理を行う。
以下の.sh
ファイルを作成する。内容は ps
と grep
コマンドで稼働中のプロセスを抽出して、特定のファイル名が含まれるプロセスがなければ、シャットダウンするというもの。
#!/bin/bash
result=$(ps aux | grep "[ プロセス名 ]" | grep -v grep)
if [ -z $result ] ; then
echo "shutdown instance"
sudo shutdown -h now
else
echo "instance is living"
fi
[ プロセス名 ]
は適宜、filename.py
などに書き換えて使用してください。
ps aux | grep "[ プロセス名 ]" | grep -v grep
atコマンドで実行する場合
at 12:30 09122019 -f pscheck_shutdown.sh
cronで実行する場合
cronの使い方はこちらを参照しました。
/etc/crontab
ファイルをコピーして、/etc/cron.d/task_cron
を作成
sudo cp /etc/crontab /etc/cron.d/task_cron
/task_cron/
の5~8行目を削除して、以下(編集後)の内容を追記。
(以下の例は、毎時実行)
編集前
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
編集後
([user]
には、使用しているユーザー名を設定してください)
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
0 * * * * root . /home/[user]/pscheck_shutdown.sh
#
cronを実行
sudo service cron restart
上記の手順で、cron
による定期的なスケジュール実行の設定は完了です。
cronのスケジュール実行を中止したいとき
cron
のスケジュール実行をやめたいときは、/etc/cron.d/task_cron
の追記した行を消去するかファイルごと削除して、sudo service cron restart
を実行すればOKです。
rm /etc/cron.d/task_cron
sudo service cron restart
参考
- 【GCP/AWS】インスタンスのシャットダウンし忘れを防ぐ
- Cronの使い方とテクニックと詰まったところ
- atコマンドについて詳しくまとめました 【Linuxコマンド集】
- psをgrepした結果からgrep自身を除外する方法
以上