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
コマンドを手動で実行すると、期待どおりの結果が得られます。
存在しないジョブを開始しようとすると、エラーメッセージが表示されるためしなかったので、ジョブが正しく登録されたと確信しています。 -)上記のコマンドを実行します)。
私は何を間違えましたか?
Lingon は、launchdを管理するための優れたGUIツールです。プロジェクトは現在サポートされていないようです...しかし、間違いなく10.5.xでも動作します。
しかし、あなたの特定の問題について...あなたは試しましたか
Sudo launchctl list
これにより、.plistが正しく起動しているかどうかがわかります。デーモンが起動していない場合は1を返し、成功した場合は '0'を返します。多分それを探してください。
「1」が表示される場合は、通常、スクリプトを間違った場所に配置したか、タイプミスをしたか、アクセス権を誤って設定したことが原因です。
また....頻繁に再起動します..私は見ました
launchctl start
再起動があった場所では効果的ではありません。
また、質問を詳しく見ると、そのrsyncコードをbashスクリプトに入れて/usr/bin/
.....に貼り付けないのはなぜですか?そうすれば、chmod+x
だけで済みます。 file ....そして、.plistを単純化して、好きなときにそのスクリプトを起動します..。
長い答え:
いくつかの基本原理を理解せずに、launchdを操作するのは困難です。そのため、ステップバイステップの説明が見つからない可能性が高く、非常に多くの機能を備えています。 ADCのスタートガイドに向かうことをお勧めします。 http://developer.Apple.com/macosx/launchd.html
launchd
、launchctl
および.plistファイルの構文launchd.plist
のマニュアルページも読むことができます。
エージェントやデーモンをどこに配置するかについてよく誤解されているので、ここで情報をプッシュしてみましょう。
~/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
することも役立つ場合があります。
これは実際には標準の動作であるというドキュメントは見つかりませんが、launchdにはplistファイルに絶対パスが必要なようです。 /usr/bin/rsync
代わりに。私のために働く!
このキーをplistファイルに追加してみてください
<key>KeepAlive</key>
<true/>
<key>RunAtLoad</key>
<true/>
これを試してみてください、私のスクリプトはプログラム部分を使用せずに動作し、プログラム引数だけです...
交換
<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>
あなたはあなたの.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
のマンページです。