誰もがcronスタイルのlaunchdジョブを(ゼロから)書くための良いチュートリアルを推薦できますか?


19

1時間ごとに実行したいかなり単純な仕事があります。を使用してそれを行うことはできましたがcronlaunchd良いことを聞いているので、これを使用してについて学習すると思いました。man launchd.plist参照としてページを取得しましたが、サンプルジョブの作成に基づいたものを探しています。


これはStackoverflowに移動する必要があります。
フィリップレーガン

5
@Philip Regan私はそれについて考えましたが、私にはそれほど多くのプログラミングは含まれていません。cron質問をしていた場合、superuser.comは適切な場所ではないでしょうか?のlaunchdAppleのバージョンcron(およびdaemontools、場合によってはその他のもの)なので、これが私の最良の選択肢だと思いました。
ハンクゲイ

また、オートマトンスクリプトに入れてiCalから実行することもできます
-user151019

皮肉なことに、3年後、私はcron / launchdプロセスを自分で実装する必要があり、まったく別の観点からこの質問を再び見ました。Stack Overflowには、開始された質問の処理方法についてさまざまな意見がありますが、これらの質問は本当に好きではありません。状況全体がおもしろいと思いました。+1
フィリップリーガン

回答:


14

launchdrootとしてデーモン(/Library/LaunchDaemonsまたは/System/Library/LaunchDaemons)を実行し、ユーザーがログインしているかどうかに関係なくデーモンを実行します。ユーザーがそのユーザーとしてログインすると、起動エージェント(/Library/LaunchAgents/または~/Library/LaunchAgents/)が実行されます。setuidを使用して、デーモンでスクリプトを実行しているユーザーを変更することはできません。この/SystemディレクトリはMac OS Xのタスク用に予約されているので、launchd理にかなっているように/Library~/Libraryフォルダをフォルダまたはフォルダに入れることをお勧めします。

したがって、最初のステップは、エージェントを作成するのかデーモンを作成するのかを決定することです。

2番目のステップは、.plistファイルを作成することです。LingonなどのGUIベースのプログラムを使用してこれを支援したり、お気に入りのテキストエディターを使用したりできます。

.plistスクリプトを1時間ごとに実行するためのサンプル(StartIntervalまたはStartIntervalCalendar、必要なキー- StartIntervalアイテムが1 x秒ごとStartIntervalCalendarに、特定の時間や日付で発生するため。StartCalendarIntervalで作成した例については、SuperUserの126907を参照)。

<?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>local.IDENTIFIER_HERE.SOMETHING</string>
    <key>OnDemand</key>
    <true/>
    <key>RunAtLoad</key>
    <false/>
    <key>UserName</key>
    <string>USERNAME HERE</string>
    <key>Program</key>
    <string>/PATH/TO/SCRIPT</string>
    <key>ProgramArguments</key>
    <array>
        <string>Argument_1</string>
        <string>Argument_2</string>
    </array>
    <key>StartInterval</key>
    <integer>3600</integer>
</dict>
</plist>

.plist必要に応じてを変更して、必要に応じてスクリプトと引数を指定し(引数は別々の行にあります)、ラベル値と同じ名前でファイルを.plist最後に保存します。(たとえば、local.my-mac.flickrstatsとして保存されますlocal.my-mac.flickrstats.plist)。まだ作成していない場合は、デーモンを作成するとき(常に実行される)、または(自分だけがログインしている)または(任意のユーザーがログインしている)にその.plistファイルを移動します。/Library/LaunchDaemons~/Library/LaunchAgents/Library/LaunchAgents

launchctlファイルをロードするために必要に応じて実行するジョブを開始します。のアイテムには/Library、sudoを使用する必要があります。たとえば、sudo launchctl load -w /PATH/TO/PLIST

:参考のためにも、スーパーユーザーで次の質問をチェックアウトするルートとしてのlaunchdコマンド広いデーモンシステムをロードし、そしてどのように私は毎日実行するスクリプトを取得することができます


4

良いチュートリアルではないことは承知していますが、AppleのDaemons and Services Programming Guideには、Scheduling Timed Jobsのセクションがあります。

完全なチュートリアルではないことは承知していますが、これを使用すると、の基本を理解できますlaunchd

また、crondタスクの例を示します。

<?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>com.apple.periodic-daily</string>
    <key>ProgramArguments</key>
    <array> 
        <string>/usr/sbin/periodic</string>
        <string>daily</string>
    </array>
    <key>LowPriorityIO</key>
    <true/>
    <key>Nice</key>
    <integer>1</integer>
    <key>StartCalendarInterval</key>
    <dict>  
        <key>Hour</key>
        <integer>3</integer>
        <key>Minute</key>
        <integer>15</integer>
    </dict>
</dict>
</plist>

リソースが私が要求したものではなく、それが少しRTFMとして私を襲ったことを認めたので、私はダウン票を投じましたが、私はそれを再考し、ダウン票を撤回したいと思います。残念ながら、質問が編集されない限り(長すぎます)、編集するにはまだ十分な担当者がいません。何か調整してもらえますか?ありがとう。
ハンクゲイ

@Hank Gay:コメントありがとうございます。私も答えを編集しました。
スタッド

4

これは私を大いに助けてくれました:http : //launchd.info

ターミナルまたはlaunchd GUI LaunchControlを使用した構成、管理、およびトラブルシューティングについて説明します。例も提供されています。


2

チュートリアルを探していたのは知っていますが、偶然にも誰かがローンチされたエントリを作成/編集するのに役立つツールを探すためにここに来るので、これを以前に使用しました:Lingon(sourceforge)

それはもはや積極的に開発されていませんが、そこにあるものは仕事をします(そして明らかにソースなどを含みます)。Snow LeopardでAmazonクラウドなどへのバックアップをスケジュールするために使用しました。


Lingonは現在App Storeにありますので、無料ではなくアクティブのままです< peterborgapps.com/lingon >
user151019

Appleのポリシー要件により、アプリストアのバージョンは機能しません。SourceForgeのコンパイル済みバージョンは問題なく動作します。ただし、保存時のモーダルダイアログでは、ログアウトまたは再起動してデーモンを有効にするように指示されますが、消えません。メニューからプログラムを終了し(強制終了ではなく)、ファイルが適切に保存されたことを確認する必要がありました。そのファイルおよびディレクトリトリガーでの障害はサポートされていません。また、AppStoreバージョンでルートとして実行されるものを作成することもできません。
marfarma
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.