本記事は「 TTDC Advent Calendar 2024 」 9 日目の記事です。
はじめに
Linuxサーバを「週末の夜にOFF(スリープ)、週明けの朝にON」するような定期実行が必要になったので、設定方法を簡単にまとめました。
諸注意
- rtcwake のマニュアル にある通り、全てのハードウェアで以下の手順が有効なわけではありません。
- 再起動できなくなることを防ぐため、任意に電源OFF/ONできる(オンプレサーバなら物理的にOFF/ONできる)状態で設定&確認することをおすすめします。
-
date
コマンドの時刻がずれていることで、動作テスト時に既に過ぎた時刻をcronに設定していることに気づかないことがあります。こちらも念のため事前確認を。
環境
- Ubuntu 22.04
設定手順
1. ハードウェアクロックの確認
ハードウェアクロックがローカル時間なのかUTCなのかを以下で確認します。
$ cat /etc/adjtime
0.0 0 0
0
LOCAL
ファイル3行目に LOCAL
または UTC
のどちらが書かれているかで判断します(上記の場合はローカル時刻、ファイルがない場合は UTC
)。
2. cron のログ出力有効化
上手く設定できていない場合の原因調査に備えてログを有効化しておきます。
以下のようにして rsyslog
の設定ファイルを開き、
#cron.* /var/log/cron.log
と書かれた行のコメントアウトを解除してから、
$ sudo nano /etc/rsyslog.d/50-default.conf
rsyslog
を再起動します。
$ service rsyslog restart
3. crontab の設定
定期実行を crontab
で設定します。
$ sudo su - # 定期実行にroot権限が必要なのでユーザ切り替え
$ crontab -e # 設定ファイルを開く
具体例:設定ファイル末尾に以下を追記すると、毎週金曜日23時にシャットダウンし、月曜日5時に起動します。
## Shutdown at 11pm on Friday and starts up at 5am on Monday.
00 23 * * fri /usr/sbin/rtcwake -m off -l -t `date -d "next monday 05:00" +\%s`
`date -d "next monday 05:00" +\%s`
の部分で、cron実行(シャットダウン)時の次の月曜日5時を計算しています。
設定後、ログ /var/log/cron.log
を確認して期待通りの日時に停止・起動できていれば完了です。
$ tail /var/log/cron.log
crontab 設定記載の注意点
- ハードウェアクロックが
UTC
の場合はrtcwake
の-l
オプションを外し-u
を設定、date
コマンドにも-u
オプションを指定します。 -
date -d "next monday 05:00" +\%s
の部分について、\%
として%
に対するエスケープが必要です。
おわりに
最後まで読んでいただき、ありがとうございました!
今後も機械学習の活用を始め、開発環境やシミュレーションなど幅広く技術情報発信をしていく予定です!
最後になりますが、本記事の内容に誤りなどあれば、コメントにてご教授お願いいたします。