Macで深夜に自動処理を実行する手順まとめ【cron × スリープ解除 × スリープ復帰】

スポンサーリンク
スポンサーリンク

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.sh

cronに登録

指定の日時にスクリプトを自動で実行するためにcronへ登録します。

crontab -e

以下の行を追加してください。

0 3 * * * <スクリプトの置き場所>/your_script.sh >> <ログファイルのパス>/cron_log.txt 2>&1

cronの書式について
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 でパス入力できます。
  • 追加後、Macを再起動またはログアウト・ログインを行う

Macをスリープ解除 → 処理 → スリープ復帰させる

スリープ解除の設定(pmset)

Macが自動的にスリープ解除し処理を行い、処理後に再びスリープ状態に戻る仕組みを作ります。

sudo pmset repeat wakeorpoweron MTWRFSU 03:00:00

毎日午前3時にMacが自動でスリープ解除されます。

スリープ解除の設定確認するには
pmset -g sched

スクリプト終了後にスリープに戻す

はじめに作成した本シェルスクリプト(例:your_script.sh)の末尾に以下を追加します。

# 自動でスリープに戻す
sudo /usr/bin/pmset sleepnow

sudoをパスワードなしで実行できるように設定(初回のみ)

特定のコマンドのみパスワードなしで実行できるように設定します。

sudo visudo

一番下に以下を追加します。

<ユーザー名> ALL=(ALL) NOPASSWD: /usr/bin/pmset sleepnow

viの操作について
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環境の違いによりモジュールエラーが出たら、モジュール再インストールを行う

夜間のデータ更新やバッチ処理に最適な方法です。ぜひ参考にしてください。

コメント

タイトルとURLをコピーしました