MacOSで定期処理(cron覚え書き)

  • 「cron」はUNIX系OSで利用されるデーモン(常駐プログラム)で設定したスケジュールで指定したプログラム実行してくれます
  • 「cron」は「/etc/crontab」または「/usr/lib/cron/tabs」内にファイル(crontabファイル)があれば起動します
  • 「crontabコマンド」はcrontabファイルを編集したりスケジュールを確認するためのコマンドです
  • 「cron」はPCがスリープ状態だと実行できません
目次
  1. crontabコマンド
  2. crontabファイルの書き方
  3. スリープ対策

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