はじめに
cron
を触る機会があったので流れを理解するために、簡単なサンプルコードを作成して cron
の設定をしてみました。
目次
-
- cronの登録
- cronの内容
- 登録しているcronの確認
- logファイルを確認
- cronの削除
-
- cronの
*
の意味 - logファイル出力ができず
permission denied
- Datetimeでエラーが起きる?
- cronの
-
- cron
- シェルスクリプト
- PHP
実装フロー
- 定期的に動作させたいファイルを作成( やりたいことはなにか )
- cronを登録( どのくらいの頻度で動かしたいか )
具体的に言うと下記のようなプログラムを想定しています。
- cron からphpコマンドを叩く(引数を渡してあげる)
- phpでは引数を受け取ってそれを毎分logファイルに書き込む
今回はあくまで練習なので簡単なコードを作成して動かしてみました。
現在時刻を引数として受け取っていればその 時間を整形し出力 する、なければ 「今何時?」 と出力する。
今回、定期的に動作させたいファイルはPHPで作成しました。
サンプルコード
sample.php
sample.php
<?php
// 引数を受け取っていれば
if (isset($argv[1])) {
// 現在時刻を整形する
$current_time = (new \DateTime($argv[1]))->format('Y-m-d H:i:s');
}
// 引数があるときとないとき出力先を決める
$output_file_path = '/var/log/cron.log';
$error_file_path = '/var/log/error.log';
// ログ出力をする
if ($current_time) {
error_log($current_time . PHP_EOL, 3, $output_file_path);
} else {
error_log('今何時??' . PHP_EOL, 3, $error_file_path);
}
cronの設定
cronの登録
ターミナル
crontab -e
cronの内容
# /usr/bin/php はphpコマンド
# シェルスクリプトであれば sh になります。
# ***のところで毎分実行の設定をしている
* * * * * /usr/bin/php [上で作成したファイルのパス]/sample.php
* * * * * /usr/bin/php [上で作成したファイルのパス]/sample.php `date '+\%Y\%m\%d\%H\%M\%S'`
登録しているcronの確認
ターミナル
crontab -l
logファイルを確認
想定通りの挙動を確認できました。
/var/log/cron.log
2021-05-22 14:25:00
2021-05-22 14:26:00
2021-05-22 14:27:00
/var/log/error.log
今何時??
今何時??
今何時??
cronの削除
今回は練習のための設定なので最後に cron を削除していきます。
ターミナル
crontab -r
削除できたか
ターミナル
crontab -l
で一応確認。
おまけ
cronの *
の意味
1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|
分 | 時 | 日 | 月 | 曜日 | コマンド |
* | * | * | * | * |
logファイル出力ができず permission denied
実行権限、書き込み権限などがないかもしれません。
対象となるファイルの権限を変更してみたら解消されるかもしれません。
ターミナル
sudo chmod 777 [ファイル名]
Datetimeでエラーが起きる?
cron
でdateコマンドでフォーマットを使用するときは %
の前に \
をつけてエスケープしてあげることで正しい挙動になるかと思います。(参考文献)
- 通常のLinuxコマンド
ターミナル
`date '+%Y%m%d%H%M%S'`
- cron の場合
ターミナル
`date '+\%Y\%m\%d\%H\%M\%S'`
おわりに
簡易的に cron
を設定してみました。
自分の環境に落とし込むと理解が捗りますね。