本文へスキップ
← ガイド一覧

決まった時間に自動で実行する (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

バックアップの予約は、サーバーのデータをバックアップするの「毎日自動でバックアップする」を参考にしてください。

必ず守ること

  1. コマンドとファイルはフルパスで書きます。 cronは普段のターミナルと環境が異なるため、pm2、nodeとだけ書くと見つけられないことがよくあります。フルパスはwhich pm2、which nodeで確認します。
  2. 結果をログファイルに残します。 行の末尾に>> /home/username/cron.log 2>&1を付けると、失敗したときに理由を確認できます。
  3. スクリプトには実行権限を与えます。 chmod +x start.sh
  4. コマンド内の%は\%と書きます。 cronでは%が改行として解釈されます。(例: $(date +\%F))
  5. 管理者権限が必要な作業(サーバーの再起動など)は、sudo crontab -eに登録します。

正しく登録されたか確認する

crontab -l                              # 登録された一覧を表示
journalctl -u cron --since today        # 今日のcronの実行記録

Windowsサーバーの場合

Windowsでは「タスク スケジューラ」が同じ役割を果たします。Windowsサーバーでプログラムを自動実行するを参考にしてください。

解決しない問題がある場合は、Discordのチケットでお問い合わせください。