手動実行から卒業|cronでシェルを毎日/毎週自動化する基本

定期実行・ジョブ

「毎朝バックアップを回す」「週一でログを整理する」——毎回手で叩くのはもう卒業しましょう。
本記事は cron(crond)と crontab の基本 を、失敗しやすいポイント(PATH・権限・ログ)まで押さえて最短で自動化できるようにまとめました。SEO想定キーワードは「cron 使い方」「シェル 自動実行」「crontab 設定」です。

こんな課題、cronで解決できます

  • 手動実行のし忘れ・人的ミスが多い
  • 退勤後や深夜にしか実行したくない処理がある
  • 定期的なバックアップ/ログ整理/レポート生成を自動化したい
  • 実行の成否や原因をログで追えるようにしたい

cron と crontab の関係(ざっくり理解)

  • cron(crond): 裏で動くスケジューラ本体(デーモン)
  • crontab: スケジュール(ジョブ)を登録・編集するための仕組み(ユーザーごとに持てる)

Linux では多くのディストリで systemd により crond が常駐 しています。止まっていると何も動きません。

まずは動作確認(1分)

  1. cron デーモンの状態を確認
    • Debian/Ubuntu 系: systemctl status cron
    • RHEL/CentOS/AlmaLinux 系: systemctl status crond
  2. ユーザーの crontab を開く crontab -e 初回はエディタ選択が出る場合あり(vim/nano など)
  3. 1分ごとに現在時刻を追記するテスト(5分で消してOK) * * * * * /bin/date >> /tmp/cron-test.log 2>&1 数分後、/tmp/cron-test.log に時刻が増えていれば成功

crontab の書式(覚えるのはここだけ)

分  時  日  月  曜  コマンド
m  h  dom mon dow  command
  • 分: 0–59、時: 0–23、日: 1–31、月: 1–12、曜: 0–7(0 と 7 は日曜)
  • 代表的な指定
    • * すべて
    • */5 5分ごと
    • 1,15 1日と15日
    • 1-5 月~金(dow を 1-5)

例)毎日 3:00 に実行

0 3 * * * /path/to/script.sh >> /var/log/myjob.log 2>&1

例)毎週月曜 7:00 に実行

0 7 * * 1 /path/to/script.sh >> /var/log/myjob.log 2>&1

シンプル指定(@記法)

@reboot   /path/to/script.sh        # 起動時
@daily    /path/to/script.sh
@weekly   /path/to/script.sh
@monthly  /path/to/script.sh

安定稼働の3原則:PATH・権限・改行コード

1) PATH(コマンドの場所)問題

cron は 最小限の環境変数 で動くため、ターミナルで動くコマンドが cron だと見つからないことが多いです。

  • フルパスで書く のが最短解(例: /usr/bin/bash, /usr/bin/python3, /usr/bin/rsync
  • もしくは冒頭で PATH を明示 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin SHELL=/bin/bash

2) 実行権限とシバン

  • スクリプトは実行権限を付与: chmod +x /path/to/script.sh
  • 先頭にシバン(推奨) #!/usr/bin/env bash set -euo pipefail

3) 改行コード(CRLF問題)

  • Windows 由来ファイルは CRLF で失敗します。LF(Unix) に統一(dos2unix で変換可)

ログを残して原因追跡をラクに

標準出力・標準エラーを両方保存

0 3 * * * /path/to/script.sh >> /var/log/myjob.log 2>&1

日次ローテーションしたいなら logrotate を併用(/etc/logrotate.d/ に設定)
大きなログが溜まっても自動で圧縮・古いもの削除が可能です。

多重起動の事故を防ぐ(基本の保険)

長時間処理が重なって 二重実行 すると破壊的。flock で排他します。

0 * * * * /usr/bin/flock -n /tmp/myjob.lock /path/to/script.sh >> /var/log/myjob.log 2>&1
  • -n はロック待ちしない(すでに実行中なら即スキップ)

よく使うレシピ(コピペ用)

平日のみ 19:30 に実行(メンテ/集計)

30 19 * * 1-5 /path/to/script.sh >> /var/log/workday.log 2>&1

毎時 15分に実行(短時間ジョブ)

15 * * * * /path/to/job.sh >> /var/log/hourly.log 2>&1

5分ごと

*/5 * * * * /path/to/ping.sh >> /var/log/ping.log 2>&1

@reboot(再起動時のウォームアップ)

@reboot /path/to/warmup.sh >> /var/log/warmup.log 2>&1

ユーザー別に実行したい(Web/DBユーザーなど)

  • 自分の crontab: crontab -e
  • 別ユーザーの crontab 編集(root で): sudo crontab -u www-data -e
  • サービス権限で動かすと ファイル権限・環境差 による不具合が減ります

「動かない」あるあるチェックリスト

  • systemctl status cron / crondactive
  • スクリプトに 実行権限シバン があるか
  • フルパス を使っているか(コマンド・スクリプト・ファイル)
  • 改行コード は LF か
  • 相対パス を使ってないか(cd が前提になっていないか)
  • 外部サービス/API 依存時、ネットワーク可達性 を確認しているか
  • cron のログを確認(例:Debian/Ubuntu) grep CRON /var/log/syslog RHEL系は journalctl -u crond

設計テンプレ(そのままメモにどうぞ)

  • 目的:何をどの頻度で、いつまでに終えたいか
  • 頻度:毎日 / 毎週〇曜 / 平日 / 5分ごと など
  • 排他:flock で多重起動防止
  • ログ:出力先、ローテーション
  • 失敗時:通知(メール/Slack/Teams などは後日拡張)
  • 実行ユーザー:root / www-data / appuser どれが妥当?
  • セキュリティ:権限(600/700)、秘密情報の扱い、置き場所

まとめ

  • crontab の基本書式と @記法 を覚えれば、日次・週次の定期処理は即自動化できます
  • PATH・権限・改行 の3点を最初に固めると「動かない」を激減できます
  • ログ保存+flock をセットにしておけば、原因追跡と事故予防まで一気にカバー

この土台さえ作れば、「通知連携」「リトライ設計」「依存関係管理」などの発展にもスムーズに進めます。まずは小さなジョブから、今日卒業しましょう。

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント