0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

macOSにおけるジョブ管理ツール、launchd。

Last updated at Posted at 2023-12-09

あらまし。

  • macOSを使う方で、自分のパソコンを自動で管理したいという方に向けて書きます。私の場合、外付けSSDに対してもTimeMachineと同様のファイル履歴管理がされる仕組みを作るために調べました。実際には「rsync_tmbackup」というCLIツールを呼び出しましたが、ここではシンプルにするためrsyncを題材にします。

前提。

  • macOSXからは、crondからlaunchdへ移行されている。
  • システムデーモン、エージェントの違いについては説明せず、エージェントを前提に説明する。
  • 扱うコマンド、ファイルによって、パーミッションの問題が発生する。その点についての説明はしない。
  • この説明では、rsyncの実行を想定している。ただし、プロパティファイルからはシェルスクリプトを埋め込んだAPPファイルを呼び出す。これは、「プライバーとセキュリティ」による、アプリケーションのアクセス許可に準じるためである。そのため、shファイルを指定した場合の考慮はしていない。
  • rsyncの引数については説明を行わない。

必要なファイル作成から、ジョブ発動までの流れ。

APPファイルを作成する。(後述する各ファイルの説明を参照。)
 ↓
プロパティリスト(plistファイル)を作成する。(後述する各ファイルの説明を参照。)
 ↓
プロパティリスト(plistファイル)をlaunchdに登録する。(後述するlaunchdへの登録を参照。)
 ↓
プロパティリスト(plistファイル)に記述されたジョブの条件や、プログラム(APP)をOSが読みこむ。
 ↓
上記の条件に応じて、プログラム(APP)が発動される。
 ↓
APPに含まれたシェルスクリプト、ここではrsyncが実行される。
 ↓
コマンドが実行される。また、後述する標準出力、エラー(StandardOutPath、StandardErrorPath)に結果が表示される。

各ファイルの説明。

  • plistファイル。
    今回のケースでは、以下のパスに配置する。
    ~/Library/LaunchAgents
    追加の情報は以下を参照ください。
    https://support.apple.com/ja-jp/guide/terminal/apdc6c1077b-5d5d-4d35-9c19-60f2397b2369/mac
    また、私が確認した限りでは絶対パスを記述しないとAutomatorの段階でうまく実行できませんでした。そのため、仮のユーザー名として「mine」を記述しています。
    LimitLoadToSessionTypeについて、公式なドキュメントでは定義を探せませんでした。今回はユーザーごとのファイル履歴というケースであるため、ネットで得た情報を暫定的に利用しています。
plist
<?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.mine.rsync</string>

	<key>LimitLoadToSessionType</key>
	<!-- GUIセッションのみ。https://stackoverflow.com/questions/9576287参考。 -->
	<string>Aqua</string>

	<key>ProgramArguments</key>
	<array>
	  <string>open</string>
	  <string>/Users/mine/Documents/Scripts/ssd_backup.app</string>
	</array>

	<key>RunAtLoad</key>
	<true/>
	<key>StartInterval</key>
 	<!-- 1時間おきに実行する。 -->
	<integer>3600</integer>

	<key>StandardErrorPath</key>
    <string>/Users/mine/rsync.error.log</string>
</dict>
</plist>
  • appファイル。
    Automaterで任意のシェルスクリプトを埋め込みます。
    概要については以下を参照ください。
    https://qiita.com/KurosawaTsuyoshi/items/425cd484e8d7759af460
    APPファイルとして保存する前に、実行してエラーがないことを確認した方が後が楽です。

launchdへの登録。

作成したプロパティリスト(plistファイル)をlaunchdに登録します。
以降、~/Library/LaunchAgents/ にプロパティリストが配置されていることを前提とします。
まず、プロパティリスト(plistファイル)が正しいかチェックします。
plutil -lint ~/Library/LaunchAgents/(ファイル名).plist
OKと表示れたら、以下のコマンドでlaunchdへ登録します。
launchctl load ~/Library/LaunchAgents/(ファイル名).plist

あとがき。

もっと細かいことがいろいろあります。
しかし、細かすぎると取り掛かるのがおっくうになりますのでなるべく簡潔にしました。
個人的な観点としては、コンシューマ向けではありません。難しすぎる。
ここまで書いて気づきました。
開発者のためにあえてmacOSでは対応しないのか。(嫌味ではありません。)
私に作れるかな〜。そのうちに考えます。

引用させていただいた方には感謝いたします。
ご覧いただきありがとうございました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?