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


14

私はとの定期的な打ち上げスケジュールすることができませんでしだlaunchctl/ launchdOS X(Leopardの)上を。基本的に、ウェブ上の指示の段階的なリストを見つけることができず、直感的なアプローチは機能しません。

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ターミナルでコマンドを手動で実行すると、予期した結果が得られます。

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

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

回答:


5

Lingonは、launchdを管理するための優れたGUIツールです。このプロジェクトは現在サポートされていないように見えます...

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

sudo launchctl list 

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

「1」が表示されるのは、通常、スクリプトを間違った場所に置いたり、タイプミスをしたり、権限を誤って設定したためです。

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

launchctl start

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

また、あなたの質問をよく見ると...そのrsyncコードをbashスクリプトに入れて...それを挿入するだけではありません/usr/bin/.....その後、あなたはchmod+xそのファイルだけを...そしてあなたの.plistを単純化することができますいつでも好きなときにそのスクリプトを起動するために....


おかげで、コマンドを追加のシェルファイルに入れて起動すると、うまくいきました。しかし、それは非常に不満足な解決策です...なぜコマンドを直接呼び出しても機能しないのですか?ところで、launchctl list やったディスプレイ1を、私は使用して手動でエージェントを開始した後にのみlaunchctl start
コンラッドルドルフ

私は前向きではありませんが、launchd .plistファイルは実際にはデーモンの「オンデマンドでの起動」基準を定義するためだけのものだと思います...おそらく<key>で渡した引数をどうするかわからなかったのでしょうProgramArguments </ key>。
CaseyIT

11

長い答え:

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

のmanページ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ファイルを編集した場合は、ロードする前に最初にデーモンを使用すると便利な場合があります。


情報をありがとう。ただし、(1)上記でリンクしたすべてのドキュメントと、さらにいくつかのドキュメントを既に読みました。エージェントを起動する方法を実際に言うところはありません。(少なくとも、私はそれをどこにも見つけませんでした。)私の直感的なアプローチが機能していれば、それは問題ないでしょう。(2)ファイル名の変更も機能しません。。:-((3)情報の一部は、例えば、それらはコマンド示唆時代遅れされているlaunchd bashデバッグするために-しかし、これはLeopard上で動作しない(launchd直接起動することはできません)。
コンラートルドルフを

@Konrad Rudolph:どういたしまして::) @Skylarkingにはいくつか興味深い点があります:ファイルの許可を確認しましたか?または、sudoコマンドを使用しましたか?また、launchctlが正常に機能するために時々再起動する必要がありました。
アルコ

3

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


0

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

取り替える

    <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

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

    <key>KeepAlive</key>
    <true/>
    <key>RunAtLoad</key>
    <true/>

0

.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。これを一度だけ指定するのがおそらく賢明です。

この最初の引数を省略したため、.plist (で名前を付けることによりProgram)rsyncを呼び出しましたが、rsyncの '最初の引数'はそう/path/to/folderでしたが、そうではありません-ar(実行中のプログラムはps、エラーですが、名前-arは0の引数のコンテンツです)。

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.