Ubuntu 定刻・プロセス監視による計画シャットダウン(at cron)


機械学習の終了時刻が深夜に及んだ時に、計画的にシャットダウンする必要があったので忘備録として残します。

環境

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 ファイルを作成する。内容は psgrep コマンドで稼働中のプロセスを抽出して、特定のファイル名が含まれるプロセスがなければ、シャットダウンするというもの。

pscheck_shutdown.sh
#!/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

参考

以上