0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Linux】cron① 基本

Posted at

はじめに

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分は避けて設定する。

参考

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?