決まった時間に自動で実行する (cron)
「毎日午前4時にバックアップ」「10分ごとに状態を確認」「サーバーが起動したらボットを実行」のように、決まったタイミングでコマンドを自動実行する方法です。Ubuntu・Debianを前提としています。
まずサーバーの時刻を韓国時間に
cronはサーバーのタイムゾーンを基準に動作します。サーバーがUTC(韓国より9時間遅い)になっていると、「午前4時」が韓国時間の午後1時になります。
timedatectl # Time zoneの行を確認
sudo timedatectl set-timezone Asia/Seoul # 韓国時間に変更
sudo systemctl restart cron # cronが変更後のタイムゾーンを使うように再起動
crontabを開く
crontab -e
初めて実行するとエディターを選ぶように求められますが、nano(通常は1番)を選ぶと簡単です。一番下に予約する内容を1行ずつ追加し、Ctrl + O、Enter、Ctrl + Xで保存して終了します。
時間の書き方
分 時 日 月 曜日 実行するコマンド
| 書き方 | 意味 |
|---|---|
0 4 * * * | 毎日午前4時 |
*/10 * * * * | 10分ごと |
0 */6 * * * | 6時間ごと(0時、6時、12時、18時) |
30 9 * * 1 | 毎週月曜日の午前9時30分 |
0 0 1 * * | 毎月1日の午前0時 |
@reboot | サーバーが起動したときに1回 |
わかりにくい場合は、crontab.guruというサイトに入力してみると、いつ実行されるかを言葉で説明してくれます。
例
# 毎日午前5時に、pm2で動かしているボットを再起動
0 5 * * * /usr/bin/pm2 restart my-bot >> /home/username/cron.log 2>&1
# サーバーが起動したときに自分のスクリプトを実行
@reboot /home/username/start.sh >> /home/username/cron.log 2>&1
バックアップの予約は、サーバーのデータをバックアップするの「毎日自動でバックアップする」を参考にしてください。
必ず守ること
- コマンドとファイルはフルパスで書きます。 cronは普段のターミナルと環境が異なるため、
pm2、nodeとだけ書くと見つけられないことがよくあります。フルパスはwhich pm2、which nodeで確認します。 - 結果をログファイルに残します。 行の末尾に
>> /home/username/cron.log 2>&1を付けると、失敗したときに理由を確認できます。 - スクリプトには実行権限を与えます。
chmod +x start.sh - コマンド内の
%は\%と書きます。 cronでは%が改行として解釈されます。(例:$(date +\%F)) - 管理者権限が必要な作業(サーバーの再起動など)は、
sudo crontab -eに登録します。
正しく登録されたか確認する
crontab -l # 登録された一覧を表示
journalctl -u cron --since today # 今日のcronの実行記録
Windowsサーバーの場合
Windowsでは「タスク スケジューラ」が同じ役割を果たします。Windowsサーバーでプログラムを自動実行するを参考にしてください。