crontabの使い方とmacのスリープスケジュール解除

crontabの設定環境

crond起動の確認

サービスの起動の確認 通常は自動起動するように設定されている。以下のコマンドでcrond が起動しているか確認できる。
# /etc/rc.d/init.d/crond status
> crond (pid xxx) を実行中...
crond が起動していなかった場合には、crond を手動で起動し、OS起動時にcrond が自動起動するように設定します。

crondファイルのありか

crontabファイルは以下に保存されている。
/var/spool/cron/user

cronコマンド

crontabが設定されているか確認

以下のコマンドで確認する
$ crontab -l
設定されていない場合は以下が返る
crontab: no crontab for

crontabに登録されている内容を削除

以下のコマンドで確認する
$ crontab -r

cron実行方法

crontab -eで編集でコマンドを編集せずにコマンドを記述したファイルを実行させる。

ディレクトリの移動

カレントディレクトリで実行されるため、cronコマンドを記述したファイルのディレクトリまでcd で移動する

crontabで指定ファイルの実行

作成したファイル(cron.txt etc)を以下のコマンドで実行する
$ crontab cron.txt

cronでのシェルスクリプトファイルの実行

x x x x x には分時日月曜日を入れる
PATH=/usr/local/bin:/usr/bin:/bin
x x x x x  sh フルパス/crontabtest.sh

cronでのPythonファイルの実行

x x x x x には分時日月曜日を入れる
PATH=/usr/local/bin:/usr/bin:/bin
x x x x x  python3 フルパス/crontabtest.py

cronコマンドの書き方

実行時間指定

分 時 日 月 曜日 コマンド
x x x x x  some_command
指定できる値は下記のようになる。 指定対象 指定範囲 分 0〜59 時 0〜23 日 1〜31 月 1〜12 または jan〜dec 曜日 0〜7 または sun〜sat

指定時間での繰り返し実行

' * 'ワイルドカードを使用する。 以下の場合毎日8:10にsome_commandを実行する
10  8 * * * some_command

◯分毎の実行

10分毎にコマンドを実行したい場合には次のように指定する。
*/10 * * * * some_command
*/xとすることで毎x実行する。

コメントアウト

行頭に' # 'でコメントアウト。

メール設定

cronでコマンドが実行される時、コマンド実行時の標準出力、標準エラー出力が以下のディレクトリにメール保存される。
/private/var/mail

メール通知を無効にする場合

MAILTOを以下のように設定する。
MAILTO=''

標準出力に出力された結果をメールアドレスで受け取る場合

MAILTOを以下のように設定する。
MAILTO='someonemail@domain'

crontab使用時の注意点

  • コンピュータスリープ時は実行できない→解決策:pmsetをcronスケジュールに組み込む
  • ディスプレイスリープ時は実行可能→解決策:pmsetをcronスケジュールに組み込む
  • PATHの設定が正しくない場合下記のようなエラーが出る
    FileNotFoundError: [Errno 2] No such file or directory: 'screen capture'
    
    -pyautoguiのlocateOnScreenを使用する場合は下記のPATHは通しておく
    /usr/sbin:
    

pyautogui実行時のエラー:理由わからず

pyautoguiのlocateOnScreenを使用していた時に、使用するキャプチャのフォルダがうまく参照できなかった。PATHもそのフォルダに通していた。
  • 対策 cronで直接.pyを実行するのではなく、.pyファイルを実行するシェルスクリプトをcronから実行させるとエラーなく動作させる事ができた。 cronファイル中のPATHがなんで通らなかったのか不明

    シェルスクリプトファイルに記載したコード

    cd ワークディレクトリ
    Python3 *.py
    

端末をスリープさせつつcronのスケジュール実行を実施する方法

cronは端末がスリープ状態では実行ができない。かといって常に立ち上がっている状態は経済的ではない。 そのため、端末のスリープ時間をスケジュール化する必要がある。 しかし、macの省エネルギー設定では単一時間の繰り返ししか設定できない。 これを解決するためにpmsetをcronに組み込んでチェーン実行させる。
 pmsetによるスリープ解除or端末起動時間の設定をファイル実行の度に変更し、スリープ解除のスケジュールを組む。 以下のようにチェーン実行させる スリープ解除時間の指定→ファイル実行→次のスリープ解除時間の指定→ファイル次のスリープ解除時間の指定→・・・ 例)6:30にスリープ解除設定→6:40にファイル実行→6:50に11:20のスリープ解除設定→11:30にファイル実行→11:40に19:50のスリープ解除設定→・・・
00 01 * * * pmset repeat wakeorpoweron MTWRFSU 06:30:00
40 06 * * * python3 /Users/Main.py
50 06 * * * pmset repeat wakeorpoweron MTWRFSU 11:20:00
30 11 * * * python3 /UsersMain.py
40 11 * * * pmset repeat wakeorpoweron MTWRFSU 19:50:00
00 20 * * * python3 /Users/Main.py
10 20 * * * pmset repeat wakeorpoweron MTWRFSU 06:30:00

cronでのsudo実行

ただし、pmsetは通常root権限で実行する必要があるため、cronの実行自体をroot権限で実行する必要がある。 以下のコマンドでrootになる
$ sudo su
そのあとcronファイルを実行させる
$ crontab cron.txt
参考にさせていただきました https://freefielder.jp/blog/2018/07/ubuntu-cron-sudo.html

ユーザに戻るにはexitでもどる
$ exit
※ユーザのcronとrootのcronの両方設定できるためどちらに設定したか把握しておく。

1 件のコメント:

  1. >ユーザのcronとrootのcronの両方設定できるためどちらに設定したか把握しておく。

    どちらか一方に設定しただけでも、スケジュールは実行されるのでしょうか?
    それと、ユーザのファイルは、/var/spool/cron/user だとして、root のファイルはどこにあるのでしょうか? ご回答をお願いします。

    返信削除

注目の投稿

pmsetの使い方とmacのスリープ解除スケジュール化

pmsetの使い方 電源管理スケジュールの確認 ターミナルで以下のコマンドを実行し、現在設定されている電源管理のスケジュールを確認できる。 pmset -g sched > Repeating power events: > wakepoweron at ...