はじめに
【Mac】cronで自動化プログラムの実装、に関しての備忘録。
🦁結論🦁
事前準備と設定を行ってからの操作になる。
また基本はターミナルでのLinuxコマンドでの操作で行う。
ターミナルで操作する際にもコマンド。
入力完了した際にもコマンドが必要。
特殊な記述により、ファイルを指定の時間で実行できる。
流れ
- 「cron」を「フルディスクアクセル」の権限付与する
- cronの設定をするEditorを設定
- ターミナルにて現在のcronの状態を確認
- crontab(cronのリスト)を編集する
- cronの時間指定する
- cronの保存をする
- cronのテストする
- ログを確認してエラーなどを修正
- 実装完了
押さえておくべき点
- 基本は絶対path(ファイル構成も基本は絶対pathになるように記述が必要)。
- スペース(インデント)などの概念はない。
- 「#」でコメントアウトできる。
- 「>>」のあとにpathを指定することでログを保存できる。
- ログをしてした後になにを保存するのかを指定する(基本"2>&1"にする→実行したこととエラーをログに残す)
- 仮想環境は関係がない。仮想環境化でも設定しても問題ない。
利用シーン
- 指定のファイルを定期実行したい。
- 指定のファイルを指定した時間に実行したい。
- 指定の時間に再起動したい。
注意点
- Macではスリープ状態になってしまうとcronは稼働しない。
- ファイルpathは絶対pathでないと認識しない(画像やCookieファイルなど)
- ログが残ってないとエラーなどは全くわからない。
cronの実装への道
流れを元に一個一個まとめます。
「cron」を「フルディスクアクセル」の権限付与する
システム環境設定
→「プライバシーとセキュリティ」を選択
→「フルディスクアクセス」を選択
→1番下にある「+」をクリック
→指紋認証(PCパスコード)を行う
→選択で「command+shift+G」のショートカットで「検索画面」を出す。
→検索画面にて「/usr/sbin/cron」と入力して「移動」クリック。
→「cron」が選択されてるのを確認して「開く」をクリック
→「cron」の項目がオンになってるかを確認
cronの設定をするEditorを設定
- Editorを開くときに使うEditorのデフォルトを「vim」にする。
「ターミナル」を開いて下記を入力
export EDITAR=vim
- 大元のPythonファイルのpathを確認
anacondaを使ってる方などは注意が必要です。
echo $PATH
確認したものをメモしておきます。
pyenv、anacondaなどを使ってる方は違うので注意が必要。
使ってない方はほぼ「/usr/bin/python3」のはず。
ターミナルにて現在のcronの状態を確認
crontabのリスト表示します。
現状のcronが設定されてるものがないかを確認する。
crontab -l
crontabを編集する
crontabを編集を開始するためのコマンドをターミナルに入力する。
crontab -e
コマンドモードから入力モードに切替
i
「i」を入力するとcrontabの下に「INSERT」で出力される。
cronの時間指定する
入力のフォーマットに沿って記入する。
分 時 日 月 曜日 実行コマンド
分: 0 から 59 まで
時: 0 から 23 まで(0は深夜0時)
日: 1 から 31 まで
月: 1 から 12 まで
曜日: 0 から 6 まで(0は日曜日)
コマンド: 実行したいコマンド
- 毎日午前1時に backup.sh スクリプトを実行する:
0 1 * * * /path/to/backup.sh
- 毎週月曜日の午前2時15分に update.sh スクリプトを実行する:
15 2 * * 1 /path/to/update.sh
- 30分間隔で report.py スクリプトを実行する:
/30 * * * * python /path/to/report.py
cronの時間指定する
対象の列のcronを削除
dd
全てのcronを削除
crontab -r
cronの保存をする
入力モードからコマンドモードに切替
入力が終わったら押すコマンド。
Esc キーを押す
保存して終了
保存する場合に入力する。
:wq 入力後、enter
保存せずに終了
保存せずに終了したい場合に
:q! 入力後、enter
cronのテストする
期間を早めて、しっかり実行できてるのかを確認しやすく設定します。
/1 * * * * python /path/to/report.py
ログを確認してエラーなどを修正
実行されてるかをログをみて確認します。
実装完了
まとめ✍️
cronにて定期実行はこれからもよく使うと思うのでここで、触れられてよかった。Linuxコマンドはもっと入力する機会を増やさないといけないなと感じた。