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

pmsetの使い方

電源管理スケジュールの確認

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

電源管理スケジュールの登録

日時時間指定の単発スケジュールの登録

’ MM/dd/yy HH:mm:ss(月/日/西暦下2桁 時/分/秒) ’の書式で作動日時を指定する。 root権限で実行していない場合はパスワードを聞かれるので入力する。 root権限でない場合はsudoで実行する。 root権限なしで2019/04/18/ 6:00:00にスリープを解除する場合、以下のコマンドとなる。
sudo pmset schedule wake "04/18/19 6:00:00"

繰り返し実行の登録

毎日実行させる場合はrepatと曜日指定で行う。 MTWRFSU はそれぞれ以下の曜日を意味する。これらを組み合わせて曜日指定を行う。
  • M:(月)
  • T:(火)
  • W:(水)
  • R:(木)
  • F:(金)
  • S:(土)
  • U:(日) 毎週(月)〜(水)11:00にシャットダウンをするには以下のコマンドとなる
    sudo pmset repeat shutdown MTW 11:00:00
    
    また、この指定方法はmagの省エネルギー設定→スケジュールの内容と重複するため、スケジュールで設定していた内容はこのコマンドにより書き換えられる。 よって、繰り返し実行コマンドを複数登録することはできない。 その場合は、以降に示すようにcronと併用し実施する。

スケジュールのキャンセル

単発スケジュールのキャンセル

単発のスケジュールはpmset -g schedにより登録を確認すると、以下のようにコマンドの最初にindexが付加されている。このindexを指定しキャンセルを行う。 0番目のスケジュールをキャンセルする場合
[0]  wake at 03/16/19 23:10:00 by 'pmset'
sudo pmset schedule cancel 0

繰り返し実行のキャンセル

以下のコマンドを実行する。
sudo pmset repeat cancel

コマンド

wake以下にも以下の動作を指定することができる
  • sleep:スリープ
  • shutdown:シャットダウン
  • wake:スリープ解除
  • wakeorpoweron:スリープ解除または電源ON
  • poweron:電源ON
pmsetコマンドマニュアル https://www.dssw.co.uk/reference/pmset.html

複数の繰り返しスケジュールを指定する

cronを併用し、スケジュール実行を実施する。
 pmsetによるスリープ解除or端末起動時間の設定をcronにより実行し、コマンド実行の度に次のスリープ解除時間を変更し、スリープ解除のチェーン実行を行うことにより実現する。
 スリープ解除時間の指定→スリープ解除→次のスリープ解除時間の指定→スリープ解除→・・・
以下のようにcronによりpmsetのスケジュールを組む。
 毎日6:30,11:20,19:50にスリープ解除の場合、最初は省エネルギー設定でもcronでもよいので、とりあえず6:30にスリープ解除設定をする。 そのあとは6:30:スリープ解除→6:50:スリープ解除設定11:20へ変更→11:20スリープ解除→11:40スリープ解除設定19:50へ変更→19:50スリープ解除→20:10スリープ解除設定6:30へ変更
00 01 * * * pmset repeat wakeorpoweron MTWRFSU 06:30:00
50 06 * * * pmset repeat wakeorpoweron MTWRFSU 11:20:00
40 11 * * * pmset repeat wakeorpoweron MTWRFSU 19:50:00
10 20 * * * pmset repeat wakeorpoweron MTWRFSU 06:30:00
今回は省エネルギー設定で30分経過でスリープモードになるように設定しているため、スリープを指定していないが、必要であればスリープやシャットダウンをコマンドに追記する。
参考 https://apple.stackovernet.com/ja/q/18276

cronはroot権限で実行する

pmsetはroot権限でない場合、パスワード入力が必要になってしまう。 よって、以下のコマンドによりroot権限になり、cronをroot権限で実行する。
sudo su
以下のようにcrontab-eまたはファイル指定により実行させる

crontabを直接編集する場合

crontab -e

ファイル指定の場合

crontab cron.txt
cronの実行に関しては以下の記事も参考にしてください。 https://kapibara3kapibara3.blogspot.com/2019/03/crontabmac.html

rootからユーザに戻る

rootからユーザに戻る場合はexitで戻る
exit
※ユーザのcronとrootのcronの両方設定することができるので、どちらに設定しているか忘れないように。

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の両方設定できるためどちらに設定したか把握しておく。

注目の投稿

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

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