- 「cron」はUNIX系OSで利用されるデーモン(常駐プログラム)で設定したスケジュールで指定したプログラム実行してくれます
- 「cron」は「/etc/crontab」または「/usr/lib/cron/tabs」内にファイル(crontabファイル)があれば起動します
- 「crontabコマンド」はcrontabファイルを編集したりスケジュールを確認するためのコマンドです
- 「cron」はPCがスリープ状態だと実行できません
crontabコマンド
-eオプションでcrontabファイル(スケジュール)を編集します
通常「viエディタ」が立ち上がります
*VISUAL環境変数またはEDITOR環境変数で指定されたエディタが立ち上がります
#cronの登録 viで編集
crontab -e
#登録しているcronの確認
crontab -l
#cronの削除
#一部だけ削除する場合は、-eオプションで編集
crontab -r
#userの指定
#指定ユーザのcrontabファイルを操作の対象にします(rootユーザのみ使用)
crontab -u: ユーザ名の指定
-r
オプションはファイルごと削除するのと同じです
複数の処理を登録した場合に「一部だけ削除」する時は-e
オプションで編集します
余談:実行権限を制御
cron.allowファイルとcron.denyファイルを使うことでcrontabの実行権限を制御できます
「cron.allow」と「cron.deny」が両方無い場合は全員使えます
*「cron.allow」があれば「cron.deny」は無視されます
- 「cron.allow」:ファイル内に記述のある人のみ使えます
- 「cron.deny」:ファイル内に記述のない人のみ使えます
crontabファイルの書き方
分 時 日 月 曜日 コマンド
とりあえずは「1分間隔」で「ホームディレクトリのtext.txt」に「uptimeコマンド」の結果を出力します
*uptimeコマンドは現在時刻や稼働時間やCPUの状態(空きを待っているプロセスの数)などを表示します
crontab -e
#vi入力モードに切り替え
i
#ファイルに書き込み
*/1 * * * * uptime >> ~/text.txt
#viコマンドモードに切り替え
Esc
#ファイルを保存しviを終了する
:wq
余談:viエディタ備忘録
vi
ファイル名 ファイルを作成して編集- 入力モード
i
現在のカーソル位置から挿入A
カーソルがある行の最後から文字入力O
前の行から入力o
後の行から入力
Esc
でコマンドモードx
1文字削除dd
1行削除yy
行コピーy数y
数行コピーG
最終行へ移動p
クリップボードの内容を下の行に貼り付ける:w
ファイルを保存する。viは終了しない
- Escでコマンドモード・vi終了
:q!
セーブせずに終了:wq
ファイルを保存し終了
スケジュール指定の例
#毎日のお昼12時
0 12 * * *
#1分おき
*/1 * * * *
#毎月20日の23:59
59 23 20 * *
#毎週金曜日の17:00
00 17 * * 5
日時の設定
「*」は設定できる全ての値全て
「分 時 日 月 曜日」の順
「*」はその項目で設定できる全ての値
- 分 0〜59
- 時 0〜23
- 日 1〜31
- 月 1〜12
- 曜日 0〜7
リストと範囲の指定
- 「/」で割る:一定時間おき
- 「, 」:複数指定
- 「-」:範囲指定
- 例:*/10 6-12 * 12 6,7
12月の土日の6時から12時までの間10分毎に実行
備考:複数コマンドの実行
コマンド1; コマンド2 | コマンド1の終了ステータスに関係なくコマンド1の実行後にコマンド1が実行されます |
コマンド1&& コマンド2 | コマンド1が正常終了した場合にコマンド2が実行されます |
コマンド1| コマンド2 | コマンド1の結果をコマンド2へ渡して結果を出力します |
コマンド1|| コマンド2 | コマンド1が異常終了した場合にコマンド2が実行されます |
コマンド1& コマンド2 | バックグラウンドで並列で実行させます |
スリープ対策
「cron」はPCがスリープ状態だと実行できません
そこで指定時間にスリープを解除する設定をします
毎日・曜日指定などであれば
「システム環境設定」→「バッテリー」→「スケジュール」から指定時間にスリープの解除とスリープの設定ができます
細かな設定は「pmsetコマンド」で電源制御ができらしいのでとりあえずメモしておきます
「pmsetコマンド」tはroot権限でない場合はパスワード入力が必要らしいのでroot権限にします
例:1時にコマンド2・3時にコマンド2を定期実行する場合
# rootにログイン
sudo su
# rootとしてcronを書く
crontab -e
i
0 1 * * * コマンド1
1 1 * * * pmset repeat sleep MTWRFSU 01:02:00 wakeorpoweron MTWRFSU 02:59:00
0 3 * * * コマンド2
1 3 * * * pmset repeat sleep MTWRFSU 03:02:00 wakeorpoweron MTWRFSU 00:59:00
Esc
:wq
#rootからユーザに戻る
exit
01:00にコマンド1を実行
01:01に「01:02にスリープ」「02:59にスリープ解除」
03:00にコマンド2を実行する
03:01に「03:02にスリープ」「翌日00:59にスリープ解除」⇨最初に戻る
- sleep:スリープ
- shutdown:シャットダウン
- wake:スリープ解除
- wakeorpoweron:スリープ解除または電源ON
- poweron:電源ON