Macで深夜に自動処理を実行する手順まとめ【cron × スリープ解除 × スリープ復帰】
Macでのcron実行に潜む意外な壁がありました。。。
「Windowsのタスクスケジューラーなら、スリープ状態でも決まった時間にちゃんと処理が走るのに、Macのcronはスリープ中は動かない…?」
そんな経験はありませんか?
私もずっと気づかずに「Macでも同じようにできるはず」と思い込んでいて、スリープ中に自動処理が動かずに困りました。
特に夜間やアクセスが少ない時間帯に自動更新をしたいのに、スリープ解除の問題で止まってしまうと作業効率が大きく落ちますよね。
この記事では、そんなMacのcronのスリープ問題をどうクリアし、自動処理を確実に実行するか。
スリープ解除から復帰まで、一連の設定方法をわかりやすく丁寧に解説します。
cronで自動処理を実行する手順
本シェルスクリプトの作成
まず、定期的に実行したい処理をシェルスクリプトにまとめます。
例:your_script.sh
(場所:<スクリプトの置き場所>/your_script.sh)
#!/bin/bash
echo "=== 処理開始: $(date) ===" >> <ログファイルのパス>/cron_log.txt
# ここにデータ更新処理などを記述
# 例: python3 update_data.py など
# 処理後にスリープ復帰
sudo /usr/bin/pmset sleepnow※上記パスは例です。ご自身の環境に合わせて必ず置換してください。
初回のみ実行権限を付与
スクリプトを実行可能にするための権限設定です。
chmod +x <スクリプトの置き場所>/your_script.shcronに登録
指定の日時にスクリプトを自動で実行するためにcronへ登録します。
crontab -e以下の行を追加してください。
0 3 * * * <スクリプトの置き場所>/your_script.sh >> <ログファイルのパス>/cron_log.txt 2>&1cronの書式について
0 3 * * * は「毎日午前3時0分に実行」を意味します。
<スクリプトの置き場所>/your_script.sh は実行するスクリプトの絶対パスに置き換えてください。
<ログファイルのパス>/cron_log.txt 2>&1 は、標準出力とエラー出力をログファイルに追記します。
viの操作について
esc → コマンドモードに戻る
:wq + Enter → 保存して終了
:q! + Enter → 保存せずに終了
cronの設定を編集して保存した直後に、Macから「cronがファイルやフォルダにアクセスしようとしています。許可しますか?」とポップアップが出ることがあります。
その際は「許可」を選択してください。

現在のcron設定を確認するには
crontab -l
cronを使うためのシステム設定(macOS)
cronがスクリプトを実行するには、macOSのセキュリティ制限で「アクセス許可」が必要です。以下の設定を行ってください。
- 「システム環境設定」 → 「プライバシーとセキュリティ」 → 「プライバシー」タブへ移動
- 左のリストから「フルディスクアクセス」を選択
- 「+」ボタンで以下のアプリを追加
- /usr/sbin/cron
- ↑Command + Shift + g でパス入力できます。
- /usr/sbin/cron
- 追加後、Macを再起動またはログアウト・ログインを行う
Macをスリープ解除 → 処理 → スリープ復帰させる
スリープ解除の設定(pmset)
Macが自動的にスリープ解除し処理を行い、処理後に再びスリープ状態に戻る仕組みを作ります。
sudo pmset repeat wakeorpoweron MTWRFSU 03:00:00毎日午前3時にMacが自動でスリープ解除されます。
スリープ解除の設定確認するには
pmset -g sched
スクリプト終了後にスリープに戻す
はじめに作成した本シェルスクリプト(例:your_script.sh)の末尾に以下を追加します。
# 自動でスリープに戻す
sudo /usr/bin/pmset sleepnowsudoをパスワードなしで実行できるように設定(初回のみ)
特定のコマンドのみパスワードなしで実行できるように設定します。
sudo visudo一番下に以下を追加します。
<ユーザー名> ALL=(ALL) NOPASSWD: /usr/bin/pmset sleepnowviの操作について
esc → コマンドモードに戻る
:wq + Enter → 保存して終了
:q! + Enter → 保存せずに終了
※ <ユーザー名> はご自身のMacのユーザー名に置き換えてください。
トラブル対処:Pythonモジュールが見つからない
問題:cronからシェルスクリプトを実行した際、Pythonスクリプトの1行目で次のようなエラーが出ることがあります。
Traceback (most recent call last):
File "/path/to/my_script.py", line 1, in <module>
import requests
ModuleNotFoundError: No module named 'requests'原因:cronで実行されるスクリプトは、通常ログイン時に使う環境とは異なるため、Pythonのモジュールが見つからないことがあります。
解決策:必要なモジュールを該当Python環境にインストール
/usr/bin/python3 -m pip install requests --user※ requestsはインストールするモジュール名に置き換えてください。
まとめ
- Macのスリープ解除とスリープ復帰を自動化することで、無人処理が可能になる
- cronを使えば毎日深夜に自動で処理が実行できる
- macOSのセキュリティ設定でcron実行許可を与える必要がある
- Python環境の違いによりモジュールエラーが出たら、モジュール再インストールを行う
夜間のデータ更新やバッチ処理に最適な方法です。ぜひ参考にしてください。

コメント