【Mac】crontabを使わずに特定のコマンドを定期実行する

Mac

こんにちは、shikiyuraです。
今回は、タイトル通りMacでcronを使わずにコマンドを定期実行する方法をメモしておきます。

コマンドを定期実行するためによく使われるものは、cronだと思います。
私も、今回のことがなければ真っ先に思い浮かぶものはcronです。
Macにもcronはあるようですが、権限やOSのセキュリティの壁などにふさがれて気軽に動かせないようです。

参考

では、どうすればいいのか。
Macに入っているlaunchdというものを使えばいいのです。
launchdとは、デーモンとエージェントを管理してくれるものです。
Macの「ターミナル」でのlaunchdを使ったスクリプトの管理 – Apple サポート | https://support.apple.com/ja-jp/guide/terminal/apdc6c1077b-5d5d-4d35-9c19-60f2397b2369/mac

裏側で自動起動させたり、定期的にコマンド実行させたりすることも可能です。
では、こいつらを使ってcronの代わりに特定コマンドを定期実行できるようにしてみます。


 

launchdの設定ファイルとファイルの置き場所

上記の通り、デーモンやエージェントの管理をしてくれているため、ファイルの場所により役割が変わってきます。
~/Library/LaunchAgentsに置くと、そのユーザとして実行されます。
/Library/LaunchDaemonsに置くとrootとして実行されます。
基本的には、~/Library/LaunchAgentsにおけばよいと思います。

Web上でlaunchdの設定ファイルを作成できるサイトがあったので貼っておきます。
わかりにくいxml形式をポチポチ書くよりも、簡単な設定を入れてボタン一発でファイルを作ってくれるので便利です。
Launched | http://launched.zerowidth.com/

上記サイトで適当に作ったタスクをいかに書いておきます。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
 <key>Label</key>
 <string>com.zerowidth.launched.test_task</string>
 <key>ProgramArguments</key>
 <array>
   <string>sh</string>
   <string>-c</string>
   <string>echo hoge</string>
 </array>
 <key>StartInterval</key>
 <integer>60</integer>
</dict>
</plist>

これは、echo hogeというコマンドを1分ごとに実行するだけの設定ファイルです。
簡単に各項目の役割をメモしておきます。

  • Label:タスクを識別するための名前、他のものと被らなければなんでもよい
  • ProgramArguments:実行するコマンド
  • StartInterval:実行のインターバル時間(秒)

上記にないもので、よく使いそうなものとしては以下のものでしょうか。

  • EnvironmentVariables:環境変数(.bashrcなどに書いている環境変数は読み込まれないので注意)
  • WorkingDirectory:コマンドを実行するディレクトリ
  • StandardOutPath / StandardErrorPath:実行ログやエラーログを吐き出す場所

そのほかに設定できる項目名などはこちらのサイトにあるので、探してみてください。
A launchd Tutorial | https://www.launchd.info/

launchdから作成したタスクを起動する

上記で設定ファイルができました。
これをlaunchdで動かしてみます。

# 起動
launchctl load /path/to/your.plist
# 止める
launchctl unload /path/to/your.plist

これにて、特定のコマンドを定期実行できるようになりました。
より複雑なことをしたい場合は、シェルスクリプトを書いて.plistから実行させればよいと思います。

まとめ

今回は、Macで特定コマンドを定期実行するためにlaunchdを使ってみました。
設定方法がxml形式だったり、launchctlで起動・停止したりと他のところで使えなさそうな知識ではありますが、
知っていればどこかで役に立つかもしれません。

ちなみに私は、特定サービスの更新状況を知るために、定期的にAPIをたたく用途で利用しました。
この程度であれば特に負荷がかかるわけでもないのでお手軽に済ませることができます。
Raspberry Piとかを使えば、cronでよいんですけどね。

 

今回はここまで。
おわり

Posted by しきゆら