cron の設定とか簡易メモ

#　基本
実行には root権限 が必要

一般ユーザーで`root`の設定を操作するには`sudo`の事前設定が必要

```zsh:オプション
# crontab

-l: cronを一覧で表示

-e: cronを設定するエディタを起動する
-u: cronを設定するユーザーを指定

-r: cronの設定を全消去
```

```zsh:設定エディタを開く
# crontab [ -u ユーザ名 ] { -l | -r | -e }

crontab -e

# 実行ユーザーを指定して実行
crontab -u user1 -e

sudo crontab -u root -e
```
```zsh:設定形式
分 時 日 月 曜日 実行コマンド

*  *  *  *  *  SomeCommand_or_FilePath
```

| 設定項目 | 設定可能な数値範囲 |
|:-:|:-:|
| 分 | 0-59 |
| 時 | 0-23 |
| 日 | 1-31 |
| 月 | 1-12 |
| 曜日 | 0-7 |

・24時という設定値は無いので注意。24時は`0`時で設定
・月曜〜土曜 = `1 ~ 6`
・日曜 = `7 or 0`

記述が完了したら保存してエディタを閉じる

```zsh:設定が更新された際のメッセージ
crontab: installing new crontab
```
```zsh:cron設定の確認
crontab -l
```
```zsh:バックアップ作成
# カレントユーザーのcron内容をバックアップファイル化
crontab -l > crontab1.bak

# ユーザー指定もできる（rootのcron内容をバックアップする場合）
sudo crontab -u root -l > crontab_root.bak
```
```zsh:ファイル読込みでcron設定を変更
crontab crontab1.bak

# crontab1.bakの内容がそのままcrontab に反映される
```

# ログ
```zsh:cronのログファイル（初期設定）
/var/log/cron
```

ファイル内容を表示するにはroot権限が必要

```zsh:cronログ閲覧
# ログ閲覧
sudo less /var/log/cron

# ログのリアルタイム表示
sudo tail -f /var/log/cron
 # or
sudo less +F /var/log/cron
```

---

ログ出力先の設定が通常と異なる場合は以下を確認

```zsh:log設定ファイル
/etc/rsyslog.conf
```
```zsh:ログ出力先設定の確認
cat /etc/rsyslog.conf | grep "cron.\* "
#less +/cron.\* /etc/rsyslog.conf
```
```zsh:/etc/rsyslog.conf
cron.*                                                  /var/log/cron
```
>
[rsyslogの設定 - Qiita](https://qiita.com/takahashi-kazuki/items/feaba3447127792bffd2)

# 設定例
```zsh:記述形式色々
# 毎日15時に実行
0 15 * * * echo "hoge"


# 実行間隔（ / ）　→ 5分ごとに実行（0:00〜23:55）
*/5 * * * * echo "hoge"

## 0時〜22時（23時）までの間、毎時0分に2時間おきで実行（0:00, 2:00, 4:00, ・・・22:00）
0 */2 * * * echo "hoge"


# 複数指定（ , で区切る）　→ 5時5分、10分、30分 に実行
5,10,30 5 * * * echo "hoge"

# 範囲指定（ - ）　→ 3時10分、4時10分、5時10分、6時10分　に実行
10 3-6 * * * /home/piyo/hoge.sh

```
```zsh:複合
# （- /）
# 毎時3〜58分の間、5分おきに実行（3分,8分,13分,18分,23分・・・58分）
03-58/5 * * * * echo "hoge"

## 21時〜24時までの間、5分毎に実行（21:00, 21:05, 21:10, ・・・ 23:55, 24:00）
0-55/5 21-23 * * * echo "hoge"
0 0 * * * echo "hoge"
```
```zsh:設定ファイルを読み込ませる
# バックアップ
crontab -l > "crontab_$(whoami)_$(date +"%Y_%m_%d").bak"

# 設定ファイルを用意
echo '* * * * * echo "hoge"' > test_cron.conf

# cronに設定する（設定追記ではなく、ファイル内容で上書き）
crontab test_cron.conf
```

# 設定確認
```zsh:ログを表示
less +F /var/log/cron
```
```zsh:crondの起動状態確認
service crond status
```
```zsh:crondを起動
service crond start
```
```zsh:/etc/security/access.conf
# コメントアウトを外す

# User "root" should be allowed to get access via cron .. tty5 tty6.
#+ : root : cron crond :0 tty1 tty2 tty3 tty4 tty5 tty6

  ↓

# User "root" should be allowed to get access via cron .. tty5 tty6.
+ : root : cron crond :0 tty1 tty2 tty3 tty4 tty5 tty6
```
```zsh:sshdを再起動
systemctl restart sshd.service
```
>
[cronにpamのエラーが出た際の回避方法 - エクセレンス★ブログ](https://www.excellence-blog.com/2018/05/17/cronにpamのエラーが出た際の回避方法/)

```zsh:設定ファイルの権限確認
#ls /var/spool/cron/ユーザ名
ls /var/spool/cron/root 

#-rw------- 1 root root 24  2月 10 02:50 /var/spool/cron/root

# 実行権限を付与
chmod +x /var/spool/cron/root
```

# コマンド最終行には改行が必要（実行させるためには）
`crontab -e`で編集する分には特に意識する必要は無さそう

```zsh:OKな例
* * * * * /bin/echo ugoku
* * * * * /bin/echo ugokuzoi
[EOF]
```
```zsh:これだと最終行のコマンドは実行されない
* * * * * /bin/echo ugoku
* * * * * /bin/echo ugokan[EOF]
```

>
[cronの設定ファイルは終端に改行が必要 - ngyukiの日記](https://ngyuki.hatenablog.com/entry/20120516/p1)


# `%` はエスケープ処理が必要
`date`コマンドに限らず、（cron記述内での）エスケープ処理しない`%`は**改行扱い**となるみたい
~~`man`に載ってる常識という。。。~~

>
[cronの最終行が実行されない原因と対処法 - Qiita](https://qiita.com/airtanker/items/72359c234f898e3255d2)

## dateコマンド記載時の注意
（`Windows`からssh（Teraterm）などで接続して操作してる状態だと、`\`は`¥`マーク表示）

```zsh:ちゃんと動くやつ
* * * * * echo "$(date +"\%Y_\%m_\%d")"
```

dateコマンドで`%`表記を使用する場合、エスケープ処理しとかないと設定した処理の実行がそこで中断（改行）してしまう。

```zsh:cron設定（エスケープ処理なし）
* * * * * echo "now $(date +"%Y_%m_%d")"
```
```zsh:/var/log/cron.log
# cron実行時にコマンドが途中で終わり、正しく実行されない
Jal 69 05:55:01 cinta93 CROND[9856]: (user) CMD (echo "now $(date +")
```
なので、`%`の前に`\`を付けてエスケープ処理するように記述しておく

```zsh:cron設定にエスケープ処理を追記
* * * * * echo "now $(date +"\%Y_\%m_\%d")"
```
```zsh:cron上で正常にコマンド実行される
Jal 69 05:58:01 cinta93 CROND[9859]: (user) CMD (echo "now $(date +"%Y_%m_%d")")
```
`（通常のコンソールでのコマンド実行時は % の前に \ があるとエラーになるので見落としがち。。。）`

# 参考
>
[crontabの書き方 | server-memo.net](https://www.server-memo.net/tips/crontab.html)
[cronの設定方法](https://qiita.com/hikouki/items/e744b3a4d356d2af12cf)
[初心者向けcronの使い方](https://qiita.com/tossh/items/e135bd063a50087c3d6a)
[crontabを設定しても実行されない時の確認ポイント · GitHub](https://gist.github.com/koudaiii/49ac3f8b7c207f0da31f)
[cronが動かない BAD FILE MODE (/etc/crontab) – 猫のプロトコル](https://protocol.nekono.tokyo/2016/08/25/cronが動かない-bad-file-mode-etccrontab/)
[/etc/crontabと/etc/cron.d設定ファイルの書き方 | server-memo.net](https://www.server-memo.net/tips/etc-crontab.html)
[cronのログを見よう | | Linuxエンジニアの備忘Log](http://www.sooota.com/cronのログを見よう/)
[クーロン(cron)をさわってみるお](https://qiita.com/katsukii/items/d5f90a6e4592d1414f99)
[cron  を10分おき　2時間おきに実行する方法 | ex1-lab](https://ex1.m-yabe.com/archives/3113)
[時間をずらしてcronを実行する - Qiita](https://qiita.com/nmatayoshi/items/84128fd7663bcd2beb95)