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の設定が正しくない場合下記のようなエラーが出る
-pyautoguiのlocateOnScreenを使用する場合は下記のPATHは通しておくFileNotFoundError: [Errno 2] No such file or directory: 'screen capture'
/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の両方設定できるためどちらに設定したか把握しておく。
>ユーザのcronとrootのcronの両方設定できるためどちらに設定したか把握しておく。
返信削除どちらか一方に設定しただけでも、スケジュールは実行されるのでしょうか?
それと、ユーザのファイルは、/var/spool/cron/user だとして、root のファイルはどこにあるのでしょうか? ご回答をお願いします。