web-dev-qa-db-ja.com

launchdでエージェントを登録する方法

OS X(Leopard)でlaunchctl/launchdを使用して定期的な起動をスケジュールすることができません。基本的に、ウェブ上で手順のステップバイステップのリストを見つけることができず、直感的なアプローチは機能しません。

sync.plistファイル:

<?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>net.madrat.utils.sync</string>
        <key>Program</key>
        <string>rsync</string>
        <key>ProgramArguments</key>
        <array>
            <string>-ar</string>
            <string>/path/to/folder/</string>
            <string>/path/to/backup/</string>
        </array>
        <key>StartInterval</key>
        <integer>7200</integer>
    </dict>
</plist>

このスクリプトをパスに入れました~/Library/LaunchAgents

次に、スクリプトを登録して、

launchctl load ~/Library/LaunchAgents/sync.plist

最後に、それが機能することをテストするために、私はジョブを開始しました

 launchctl start net.madrat.utils.sync

- 何も起こらなかった。ターミナルでrsyncコマンドを手動で実行すると、期待どおりの結果が得られます。

存在しないジョブを開始しようとすると、エラーメッセージが表示されるためしなかったので、ジョブが正しく登録されたと確信しています。 -)上記のコマンドを実行します)。

私は何を間違えましたか?

14
Konrad Rudolph

Lingon は、launchdを管理するための優れたGUIツールです。プロジェクトは現在サポートされていないようです...しかし、間違いなく10.5.xでも動作します。

しかし、あなたの特定の問題について...あなたは試しましたか

Sudo launchctl list 

これにより、.plistが正しく起動しているかどうかがわかります。デーモンが起動していない場合は1を返し、成功した場合は '0'を返します。多分それを探してください。

「1」が表示される場合は、通常、スクリプトを間違った場所に配置したか、タイプミスをしたか、アクセス権を誤って設定したことが原因です。

また....頻繁に再起動します..私は見ました

launchctl start

再起動があった場所では効果的ではありません。

また、質問を詳しく見ると、そのrsyncコードをbashスクリプトに入れて/usr/bin/.....に貼り付けないのはなぜですか?そうすれば、chmod+xだけで済みます。 file ....そして、.plistを単純化して、好きなときにそのスクリプトを起動します..。

5
CaseyIT

長い答え:

いくつかの基本原理を理解せずに、launchdを操作するのは困難です。そのため、ステップバイステップの説明が見つからない可能性が高く、非常に多くの機能を備えています。 ADCのスタートガイドに向かうことをお勧めします。 http://developer.Apple.com/macosx/launchd.html

launchdlaunchctlおよび.plistファイルの構文launchd.plistのマニュアルページも読むことができます。

エージェントやデーモンをどこに配置するかについてよく誤解されているので、ここで情報をプッシュしてみましょう。

  • ログインしているユーザーがいない場合でもジョブを実行する必要がある場合は、/ Library/LaunchDaemonsに配置します。
  • ユーザーがログインしているときにのみ役立つ場合は、/ Library/LaunchAgents、または特定のユーザーの個人用LaunchAgentsディレクトリ(〜/ Library/LaunchAgents)に配置します。
  • システム提供のデーモン用に予約されている/ System/Libraryにジョブを配置しないでください。
~/Library/LaunchAgents         Per-user agents provided by the user.
/Library/LaunchAgents          Per-user agents provided by the administrator.
/Library/LaunchDaemons         System wide daemons provided by the administrator.
/System/Library/LaunchAgents   Mac OS X Per-user agents.
/System/Library/LaunchDaemons  Mac OS X System wide daemons.

短い答え:

Plistファイルの名前が間違っている可能性があり、現在テストできませんが、net.madrat.utils.sync.plistに設定します。ファイルを編集した場合は、ロードする前に最初にデーモンをunloadすることも役立つ場合があります。

11
Arko

これは実際には標準の動作であるというドキュメントは見つかりませんが、launchdにはplistファイルに絶対パスが必要なようです。 /usr/bin/rsync代わりに。私のために働く!

3
Erik Schoster

このキーをplistファイルに追加してみてください

    <key>KeepAlive</key>
    <true/>
    <key>RunAtLoad</key>
    <true/>
0
agile

これを試してみてください、私のスクリプトはプログラム部分を使用せずに動作し、プログラム引数だけです...

交換

    <key>Program</key>
    <string>rsync</string>
    <key>ProgramArguments</key>
    <array>
        <string>-ar</string>
        <string>/path/to/folder/</string>
        <string>/path/to/backup/</string>
    </array>

    <key>OnDemand</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>rsync</string>
        <string>-ar</string>
        <string>/path/to/folder/</string>
        <string>/path/to/backup/</string>
    </array>
0
Becky

あなたはあなたの.plistファイルに1つの間違ったことと1つの怪しげなことを持っています(これらの点のそれぞれは以前の答えで触れられました;私はここでそれらを一緒にしています)。

あなたはもっとよく書くでしょう:

<key>ProgramArguments</key>
<array>
  <string>/usr/local/bin/rsync</string>
  <string>-ar</string>
  <string>/path/to/folder/</string>
  <string>/path/to/backup/</string>
</array>

ProgramArguments配列の最初の引数は実行されるプログラムです-これは省略しています。 Programキーを省略すると、デフォルトでProgramArgumentsの最初の引数になります。これを1回だけ指定するのがおそらく賢明です。

この最初の引数を省略したため、.plist willは(Programで名前が付けられて)rsyncを呼び出しましたが、rsyncの「最初の引数」は/path/to/folderではなく-arでした(実行中のプログラムはエラーで終了する前に、ps出力に非常に短時間表示されますが、0番目の引数の内容である-arという名前が付けられています。

rsyncへのパスを含めるためにhaveを使用することはありませんが、この種のコンテキストでは、PATHが適切に設定されていることに依存する必要がないように、そうすることはおそらく賢明です。

このドキュメントはlaunchd.plist(5)にあります。マンページでは、ProgramArgumentsキーの値がexecvp(3)に渡されることを強調していることに注意してください。 PATH検索について説明しているのはexecvpのマンページです。

0
Norman Gray