目的

Macで特定の時刻でプログラム処理を行うためのメモ

環境

  • macOS Big Sur バージョン 11.4

参照サイト

launchd, launchctlについて(導入編)

対応の前に

やり方としてはcronコマンドとlaunchctlコマンドのどちらかの手順があるよう。
Appleとしてはlaunchctlを推奨しているらしいです。

私の環境では上記の両コマンドとも準備せずにターミナルで利用できましたが。
エンジニアの端くれということで、開発ツールがえいきょうしているかもしれません。

また、この記事で利用するcronの具体的な設定方法、viでの入力方法、plistでの設定方法の説明は省略いたします。

そして、 あらかじめ実行したいプログラム:今回はshファイルを準備しておいてください。

cronコマンドでの設定

ターミナルより以下コマンドを入力します。
入力ミスに気をつけてください。

cronコマンドでの設定
$ crontab -e

未設定の場合は何も表示されていないので以下の例のように記載します。
1〜5までの数字は適当です。

cronコマンド 記載方法1
1 2 3 4 5 /Users/xxx/test.sh
上記の数字の部分について、
cronコマンド 記載方法2
1の部分:実施したいプログラムの時刻の分を記載
2の部分:実施したいプログラムの時刻の時を記載
3の部分:実施したいプログラムの時刻の日にちを記載
4の部分:実施したいプログラムの時刻の月を記載
5の部分:実施したいプログラムの時刻の曜日を記載

例えば、5月27日 13時25分にシェルを実施したい場合は

cronコマンド 記載方法3
25 13 27 5 * /Users/xxx/test.sh

他の例として

cronコマンド 記載方法4
# 毎事0分に、1時間おきに実施したい場合は以下
0 * * * * /Users/xxx/test.sh


# 10分おきに実施したい場合は以下
*/10 * * * * /Users/xxx/test.sh

wqでファイル編集を完了します。
完了時にMacのポップアップが出力されるかもしれませんがOKを選択します。

時刻が来て、うまくプログラムが実行されることを確認します。

launchctlコマンドでの設定

参照サイトによると、実行するユーザによってパスが少し違うようですが。。
今回は一般権限のユーザとして、以下のパスに遷移します。

launchctlコマンドでの設定
$ cd ~/Library/LaunchAgents/

その配下に以下の様なplistを配置します。
ファイル名は以下のLabelキーの値(ここならcom.sh.test.plist)とします。

plist記載方法1
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>com.sh.test</string>
	<key>ProgramArguments</key>
	<array>
		<string>/Users/xxx/test.sh</string>
	</array>
	<key>StartCalendarInterval</key>
	<dict>
		<key>Hour</key>
		<integer>13</integer>
		<key>Minute</key>
		<integer>5</integer>
	</dict>
</dict>
</plist>

上記ファイルについて、

plist記載方法2
ProgramArguments : 実施したいプログラムファイルを記載
Hour : ファイル実行したい時刻
Minute : ファイル実行したい分

もっといろんな設定が可能ですが、最小限にしています。
plistを配置後は
ターミナルより以下コマンドを実行
上記作成したplistのファイル名をcom.sh.test.plistとします。

plist記載方法3
launchctl load ~/Library/LaunchAgents/com.sh.test.plist

時刻が来て、うまくプログラムが実行されることを確認します。

もしplistファイルを更新した場合は
以下のように一回unloadしてから再度loadすると良いようです。

plist記載方法4
launchctl unload ~/Library/LaunchAgents/com.sh.test.plist

以上となります。