6
Macを起動する

Tigerの目立たない追加機能の一つに、新しいUnixユーティリティ「launchd」があります。これは、アプリケーション、AppleScript、シェルスクリプト、Automatorワークフローなど、あらゆるものを自動実行できます。起動時やログイン時、固定または繰り返しのスケジュール、ファイル変更時、フォルダへの新規ファイル追加時にプログラムを起動できます。さらに、特定のポートへのネットワークアクセスに応じてプログラムを起動することも可能です。

Launchdは、常時実行が必要なバックグラウンドプロセスの数を制限することで、システムパフォーマンスを向上させます。また、自動化も容易になります。このツール1つで、cron、rc、watchdogといった多数の起動ユーティリティを置き換えることができます。ここでは、2つのサンプルジョブ(シンプルな日次バックアップと、Dropboxフォルダからデスクトップにファイルを移動するジョブ)の作成手順を解説します。もしLaunchdに興味をお持ちいただけましたら、こちらでLaunchdについてさらに詳しく学んでいただけます。

離陸の準備

launchdジョブを作成するには、起動する対象、タイミング、方法をリストした設定ファイル(.plist)を作成します。次に、このファイルを複数のフォルダのいずれかに配置します。選択したフォルダによって、ジョブの読み込みタイミングと、ルートユーザーとして実行するか、他のユーザーとして実行するかが決まります。

ジョブを作成する際には、Peter Borg氏による無料のLingonを使えば、面倒な作業を軽減できます。このユーティリティはXMLコードを作成し、ターミナルを使わずに済むような手順を簡単に実行できます。

Lingon を開くと、プログラムウィンドウ全体に 5 つのタブが表示されます。これらは、launchd ジョブを保存できるフォルダを表しています。

•  マイエージェント このペインにリストされるジョブは、/ ユーザーフォルダ /Library/LaunchAgents に保存されます。ログイン時に読み込まれます。ユーザーフォルダ内のファイルにのみ影響するジョブ、またはログイン時にのみ実行するジョブには、この場所を使用してください。

•  ユーザーエージェント このペインにリストされているジョブは/Library/LaunchAgentsに保存されます。 これらのジョブは 、ユーザーがログインすると読み込まれ、そのユーザーとして実行されます。これは、バックグラウンドプログラムをマシンの全ユーザーに対して実行したいが、各ユーザーのログイン項目リストに追加したくない場合に便利です。

•  ユーザーデーモン このパネルにリストされているジョブは/ライブラリ/LaunchDaemonsに保存されます。これらのジョブはMacの起動時に読み込まれ、ルートユーザーとして実行されます。これは、ログインしているユーザー(いる場合)に関係なく実行する必要があるジョブや、管理者パスワードを必要とするアクションを実行するジョブに便利です。

•  システムエージェントとシステムデーモン ここにリストされているジョブは、それぞれ/System/Library/LaunchAgentsと/System/Library/LaunchDaemonsに保存されます。ユーザーデーモンペインのジョブと同様に、起動時に読み込まれ、ルートユーザーとして実行されますが、Systemフォルダ内にあるため、変更しないでください。ただし、 Tigerにプリインストールされているすべてのlaunchdジョブが含まれているシステムデーモンリストを確認すると役立つ かもしれません。これらの多くは以前はcronを使用していました。(cronの詳細については、ここをクリックしてください。)

バックアップジョブを作成する

MacのUsersフォルダを毎日バックアップするジョブを作成したいとします。AutomatorとiCalを使うこともできますが、ワークフローではログイン中のユーザーが所有していないファイルはスキップされてしまいます。launchdを使えば、全ユーザーのデータを同時にコピーし、ログインしているユーザー(いる場合)に関係なくバックアップを実行するようにスケジュールを設定できます。

まず、Lingonを開きます。ツールバーの「新規」ボタンをクリックし、表示されるシートで「ユーザーデーモン」を選択します。「作成」をクリックし、管理者パスワードを入力します。残りの設定は、表示されるシートに入力します。

ジョブに名前を付ける 「基本」タブをクリックし、「ラベル」フィールドに名前を入力します。この名前はコンピュータ上で一意である必要があります。そうでないとジョブが読み込まれません。Appleは、 com.macworld.DailyBackupという命名パターンを推奨しています。 名前の最初の2つの部分は、ドメイン名を逆順に並べたような形式にする必要があります。(実際のドメイン名を使用することも、新しいドメイン名を作成することも、 com.your_short_user_nameを使用することもできます。 この規則は、同じ名前が複数の人に使用されないようにするためのものです。)Lingonは、 ファイルを保存するときに 自動的に.plist拡張子を追加します。

開始引数: 無料のLingonユーティリティを使うと、launchdジョブの作成がはるかに簡単になります。ProgramArgumentsセクションに、実行したいプログラムのパスと引数を入力します。各引数またはフラグは1行ずつ記述します。(画像をクリックするとスクリーンショットが開きます)

ターゲットを選択する 「ProgramArguments」フィールドの横にあるプラス記号(+)ボタンをクリックし、 起動したいプログラムのフルパスを入力します 。この例では、Unixコマンドを実行します。これらのコマンドでは、多くの場合、 オプションを設定するための フラグと、操作対象のファイルまたはフォルダを指定するための引数 が使用されます。Lingonに入力する際は、これらの項目(通常はスペースで区切られます)をそれぞれ別の行に入力する必要があります(スクリーンショットを参照)。

実行したいコマンドは

rsync -aE /ユーザー /ボリューム/バックアップ/

これにより、Users フォルダの内容全体が、Backup という名前のボリューム (おそらく外付け FireWire ドライブ) にコピーされます。

rsyncプログラムは/usr/binディレクトリにあるので、プラス記号ボタンをクリックした後、テキストフィールドをダブルクリックして入力します。

/usr/bin/rsync

次に、プラス記号ボタンをもう一度クリックして、フラグを入力します。

-aE

1つの

アーカイブモードと

E

2 行目に、リソース フォークなどの拡張属性を指定します。

議論

/ユーザー

コピーするフォルダを指定する は、独自の行に記述します。

/ボリューム/バックアップ/

は、rsync にファイルのコピー先を指示します。(Mac の場合は、外付けハードドライブの名前を入力するか、別の場所へのパスを入力します。)

Unixコマンドではなく通常のアプリケーションを起動するlaunchdジョブの場合、アプリケーションへのパスだけでなく、そのパッケージ内の実行コードを含むファイルへのパスも必要になることに注意してください。例えば、iTunesのパスは次のようになります。

/アプリケーション/ iTunes.app/コンテンツ/MacOS/iTunes

実行させる起動するもの を指定しました 。次の(そして最も難しい)ステップは、 いつ起動するかを定義することです 。Lingon には多くのオプションがあります(詳細は「起動時間」をご覧ください)。この例では、2つだけ選択してください。

「基本」ペインで「オンデマンド」オプションを選択します。他のオプションはオフのままにしておきます。(「RunAtLoad」オプションを選択した場合、ジョブはすぐに実行されますが、今回は時間を指定します。)

「その他」タブをクリックします。「StartCalendarInterval」テキストフィールドに、次のように入力します。

1

「時間」フィールドに 0 と入力し(他のフィールドは空白のままにして)、このジョブを毎日午前 1 時に実行します。その時間に Mac が通常電源オフになっているかスリープ状態になっている場合は、0 (ゼロ) を真夜中とする 24 時間制を使用して別の時刻を入力します。

ロードする 「保存してロード」ボタンをクリックして、launchd ジョブを保存し、メモリにロードします。(「保存のみ」ボタンをクリックすると、次回の再起動時またはログイン時にジョブが自動的にロードされます。)

ロード済みのジョブを一時的に無効にするには、適切なフォルダタブ(例:My Agents)をクリックし、ジョブを見つけて「アンロード」ボタンをクリックします。再度ロードするには「ロード」をクリックします。ジョブを削除せずに恒久的に無効にするには、「編集」をクリックし、「基本」タブをクリックして「無効」オプションを選択します。

ドロップボックスにスプリングを装着する

launchdジョブの作成方法が分かったので、次は別のジョブを試してみましょう。Drop Boxフォルダ(/ ユーザーフォルダ /Public/Drop Box)に保存されているすべてのファイルをデスクトップに瞬時に移動するジョブです。こうすれば、ネットワーク上の他のユーザーからファイルが送られてきたときに、わざわざファイルを探す必要がなくなります。

まず、お気に入りのテキスト エディター (たとえば、Bare Bones Software の無料の TextWrangler) を使用して、簡単なスクリプトを作成します。

	#!/bin/bash mv ~/Public/Drop Box/* ~/Desktop/	

スクリプトに「DropBox」という名前を付けて保存(またはダウンロード)します。ターミナル(/Applications/Utilities)を開き、以下のコマンドを入力します。

chmod u+x

スペースを入力し、ファイルをプロンプトにドラッグしてパスと名前を入力します。Returnキーを押します。

Lingonを開きます。バックアップジョブと同じ手順ですが、いくつか変更点があります。ジョブ作成時に「ユーザーデーモン」ではなく「マイエージェント」を選択すると、ログイン時にのみ実行されます。「基本」タブをクリックし、名前を入力します(例:

com.macworld.DropBox

—ラベル テキスト フィールドに入力します。

「基本」タブのまま、「ProgramArguments」の横にあるプラス記号ボタンをクリックします。テキストフィールドの1行目をダブルクリックし、FinderからDropBoxスクリプトファイルを「ProgramArguments」フィールドの1行目にドラッグして、名前とパスを入力します。「OnDemand」オプションを選択します。

「パス」タブをクリックします。「WatchPaths」の横にあるプラス記号ボタンをクリックし、フィールドをダブルクリックして入力します。

	/Users/ ユーザーフォルダ /Public/Drop Box	

「保存して読み込む」をクリックします。テストするには、任意のファイルをDrop Boxフォルダに移動してください。ファイルはすぐに消え、デスクトップに再び表示されるはずです。

仕事のトラブルシューティング

コードは非常に厄介です!不要なスペース、大文字と小文字の誤用、タイプミスなどでジョブが失敗する可能性があります。launchd ジョブが正しく動作しない場合は、「アンロード」をクリックしてジョブを終了してください。スクリプトがある場合は、ターミナルで手動で実行して再確認してください。次に、Lingon の「エキスパート」パネルに表示されるジョブの .plist の内容を、これらのスクリーンショットと比較してください。すべてが一致する場合は、「基本」パネルに移動し、「無効」オプションが選択されていないことを確認して、「保存のみ」をクリックします。「再ロード」をクリックしてジョブを再読み込みしてください。

[ Joe Kissell は、Mac OS X ソフトウェアに関する電子書籍を多数執筆しています。 ]