はじめに
cronジョブについて調べた内容をまとめます。本記事はCronジョブの基本事項が中心です。
cronとは
指定した日時や間隔で自動的にコマンドやスクリプトを実行するための仕組み。Unix系オペレーティングシステムで使われる。
crontabファイルという設定ファイルを使って、Cronジョブを定義する
crontabの定義方法
主なコマンド
コマンド | 説明 |
---|---|
crontab -e | crontabを編集する |
crontab -l | crontabを表示する |
crontab -r | crontabを削除 |
書式
* * * * * コマンド
-
*
は左端から分(0~59)、時(0~23)、日(1~31)、月(1~12)、曜日(0~6、日曜=0または7)を指定する -
* * * * * コマンド
はコマンドを1分ごとの実行する
定義方法①(crontab -e
)
-
crontab -e
を実行してcrontabファイルを開く
crontab -e
- crontabファイル内にジョブを書き込む
- 7月31日午前3時15分に「Hello, world!」という文字列が追記される
15 3 31 7 * echo "Hello, world!" >> /tmp/hello.log
定義方法②(ワンライナー)
(crontab -l 2>/dev/null; echo '15 3 31 7 * echo "Hello, world!" >> /tmp/hello.log') | crontab -
-
crontab l
:現在のcrontabの内容を表示 -
2>/dev/null
:crontabが存在しない場合のエラー出力を無視 -
echo "15 3 31 7 * echo \"Hello, world!\" >>
:新しいジョブを追加 -
(...;...)
:サブシェルで二つの出力を連結 -
| crontb -
:標準入力から新しいcrontabとして登録
応用・定義方法③(ワンライナーで複数のジョブを追加する)
-
printf
コマンド を使って\n
で改行する
(crontab -l 2>/dev/null; printf '15 3 31 7 * echo "Hello, world!" >> /tmp/hello.log\n20 4 1 8 * echo "Hello, Taro!" >> /tmp/hello.log\n25 5 2 8 * echo "Hello, Hanako!" >> /tmp/hello.log\n') | crontab -
応用・定義方法④(ワンライナーで複数のジョブを追加する)
- ヒアドキュメントを使う
- ヒアドキュメント内で$PATHなどの変数展開をさせたくない場合は
'EOF'
のようにシングルクオテーションで囲む
(crontab -l 2>/dev/null; cat <<'EOF'
15 3 31 7 * echo "Hello, world!" >> /tmp/hello.log
20 4 1 8 * echo "Hello, Taro!" >> /tmp/hello.log
25 5 2 8 * echo "Hello, Hanako!" >> /tmp/hello.log
EOF
) | crontab -
- ③と④ともcrontabファイルでは下記のように出力される
15 3 31 7 * echo "Hello, world!" >> /tmp/hello.log
20 4 1 8 * echo "Hello, Taro!" >> /tmp/hello.log
25 5 2 8 * echo "Hello, Hanako!" >> /tmp/hello.log
注意点
1.環境変数を明示する
cronジョブ実行時の環境変数とパスは最小限しかセットされないため、crontabファイル内で明示的に設定する
- cronは通常のログインシェルで読み込まれる
.bash_profile
や.bashrc
などの設定ファイルを読み込まない - 特に
$PATH
は/usr/bin:/bin
しか通っていない
定義例
- すべてのcronジョブに共通して設定したい場合は、ファイルの先頭部分に記述する
- 特定のcronジョブでのみ使いたい場合はcronジョブの行内に書く
PATH=/usr/local/bin:$PATH
cronジョブ実行時にセットされる環境変数の中身を確認する方法
- 下記をcrontabファイルに追記する
* * * * * echo $PATH >> /tmp/cron_path.log
* * * * * echo $HOME >> /tmp/cron_path.log
- 書き込み先のファイルの出力を確認する
$ tail -f /tmp/cron_path.log
/home/myhome
/usr/bin:/bin
2. 絶対パスを使用する
パスを指定する際は、絶対パスを使用する
- cronジョブはどのディレクトリで実行されるか不定であるため、相対パスを指定しない
3. ログを出力する
実行結果をログファイルに出力して管理する
定義例
0 3 * * * コマンド >> /var/log/script.log 2>&1
-
>>
:標準出力をログファイルに追記する -
2>&1
:標準エラー出力も標準出力と同じ場所にリダイレクトする
4. 0分ジャストの設定は避ける
0分ジャストはジョブを設定されやすいのジョブが重複し、サーバ負荷が集中する可能性があるため、0分は避けて設定する。
参考