バックアップやログ整理を自動で回すなら cron。書き方はシンプルですが、ハマりどころが決まっているので合わせてまとめます。
基本の書式
crontabは「いつ」「何を」を1行で書きます。
分 時 日 月 曜日 コマンド
例:
0 3 * * * /usr/local/bin/backup.sh … 毎日3:00
*/5 * * * * /usr/local/bin/check.sh … 5分ごと
0 9 * * 1 /usr/local/bin/weekly.sh … 毎週月曜9:00
* は「毎」、*/5 は「5ごと」です。
編集と確認
crontab -e … 編集
crontab -l … 一覧確認
ハマりどころ1:PATHが違う
cronは、手動実行時とは環境変数(特にPATH)が異なります。手で打つと動くのにcronだと動かない、の大半はこれです。コマンドはフルパスで書くのが鉄則です。
0 3 * * * /usr/bin/php /var/www/app/artisan schedule:run
ハマりどころ2:ログを残していない
cronは黙って動くので、失敗しても気づけません。必ず出力をログへ流します。
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
2>&1 でエラー出力もまとめてログへ。これがないと「動いてるつもりで動いていない」事故になります。
ハマりどころ3:多重起動
処理が前回分の実行中にまた起動して、二重に走ることがあります。flock で排他制御すると安全です。
0 * * * * /usr/bin/flock -n /tmp/job.lock /usr/local/bin/job.sh
ハマりどころ4:時刻とタイムゾーン
サーバの時刻・タイムゾーンがズレていると、意図しない時間に走ります。date で確認し、NTPで同期しておきます。
まとめ
- コマンドはフルパス
- 出力は必ずログへ(
>> log 2>&1) - 多重起動は
flockで防ぐ
cronは「書いて終わり」ではなく、「ちゃんと動いているかログで確認する」までがセットです。ここを押さえるだけで、自動化がぐっと安定します。