【Mac】crontabを使わずに特定のコマンドを定期実行する
こんにちは、shikiyuraです。
今回は、タイトル通りMacでcronを使わずにコマンドを定期実行する方法をメモしておきます。
コマンドを定期実行するためによく使われるものは、cronだと思います。
私も、今回のことがなければ真っ先に思い浮かぶものはcronです。
Macにもcronはあるようですが、権限やOSのセキュリティの壁などにふさがれて気軽に動かせないようです。
参考
- macOS 10.15 catalina で crontab を使用する | 林檎コンピュータ | https://mac-ra.com/catalina-crontab/
- macOS Catalinaでcronが動いてくれなくなった | N-blog [ver. 3.0] | https://blog.n-function.com/806/
では、どうすればいいのか。
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でよいんですけどね。
今回はここまで。
おわり