
ほとんどの最新のUNIXでは、cronは各/etc/cron.d
タスクが指定されたユーザーとして実行される個々のcrontabファイルをサポートしています。これらのファイルを編集すると、crontabが自動的に更新されます。これにより、個々のパッケージはグローバルcrontabを汚染したり、ユーザー固有のcrontabを使用せずに独自の自動化タスクをインストールできます。
OSXはこれをサポートしていないようです。これは本当ですか?
それでは、これを実装するための最良の方法は何ですか?私はOSXで開発していますが、Linuxで本番コードを実行しているので、launchdの代わりにcrondを使用する必要があります。後者が潜在的な利点を持っているにもかかわらず。
答え1
OS Xではlaunchdを使用する必要があります。これを実装するために例を挙げて説明します。
そのフォルダに移動して、/Users/your-username/Library/LaunchAgents
次のplistファイルを保存します。名前をで指定しましたが、com.username.testscript.plist
自由に変更できます。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.your-username.testscript</string>
<key>ProgramArguments</key>
<array>
<string>/Users/your-username/bin/testscript.sh</string>
</array>
<key>Nice</key>
<integer>1</integer>
<key>StartInterval</key>
<integer>60</integer>
<key>RunAtLoad</key>
<true/>
<key>StandardErrorPath</key>
<string>/tmp/com.your-username.testscript.err</string>
<key>StandardOutPath</key>
<string>/tmp/com.your-username.testscript.out</string>
</dict>
</plist>
文書は非常に自明です。 60秒ごとにコマンドを実行し、/Users/your-username/bin/testscript.sh
ロード時に実行され、エラーを保存して/tmp/com.username.testscript.err
ログインします/tmp/com.username.testscript.out
。
ディレクトリ/Library/LaunchAgents/
またはを使用することもできます/Library/LaunchDaemos/
。
答え2
OS Xでは、通常どおりcrontabを使用できます。唯一の違いは、ユーザー固有のファイルが/usr/lib/cron/tabs/にあることです。コマンドはcorontab
アクセス方法を知っています。 cronデーモンはOS Xではデフォルトで実行されませんが、launchd
/usr/lib/cron/tabs/にファイルがある場合、または/etc/crontabがある場合は起動します。
言い換えればlaunchd
:@jherranが言ったように、launchd
このプロジェクトはOS Xでこれを行うより一般的な方法ですが、cronとは少し異なります。
プロジェクトには2つの主な種類があります
launchd
。 LaunchDaemons(通常はrootとして実行)とLaunchAgents(通常のユーザーとして実行されますが、ログインセッション内でのみ実行)。 LaunchAgents は、/Library/LaunchAgents (ログインしているユーザーに対して実行されます) からシステム全体にインストールすることも、 ~/Library/LaunchAgents (そのユーザーに対してのみ実行されます) にユーザーごとにインストールすることもできます。 LaunchDaemons はシステム全体にのみインストールできます。対照的に、クローンジョブ(ユーザー固有のジョブを含む)はログインセッションとは無関係に実行されます。
コンピュータがスケジュールされた起動時にスリープモードまたはシャットダウンした場合は、cronジョブをスキップします。
launchd
複数回見逃した実行が単一の実行にマージされても、プロジェクトは次の機会(起動、起動、ログインなどの後)で実行されます。cron は、実行後に忘れてしまうような方法でジョブを開始し、
launchd
子がクラッシュしたりシャットダウンした場合に再開できますKeepAlive
。男launchd.plist)および/または開始した子プロセスをクリーンアップ(つまり終了)します(キーを参照AbandonProcessGroup
)。タスクが独自に保護され、.plist ファイルで関連する設定を調整しないと、多くの問題が発生する可能性があります。launchd
プロジェクトの開始時期に対するより多くのオプションのサポート:特定の時間、時間間隔、さまざまな種類のイベント、いつも走っている...もう一度見てください男launchd.plist。最後に、launchd.plistファイルのコマンド形式は多くの人を混乱させます。
launchd
コマンドはシェルを介して実行されないため、変数参照、~
パス、I/O リダイレクトなどは効果がありません。さらに、コマンドラインは必要なく、キーにProgramArguments
単語の「配列」が必要です。これは本質的にコマンドと引数として扱われます。たとえば、次のよう/path/to/somecommand -xv "arg number 1" arg2 arg3 >>/tmp/somecommand.log
に書くことができます。<key>ProgramArguments</key> <array> <string>/path/to/somecommand</string> <string>-xv</string> <string>arg number 1</string> <string>arg2</string> <string>arg3</string> </array> <key>StandardOutPath</key> <string>/tmp/somecommand.log</string>
キーがもう1つありますが、引数をよく理解していない限り
Program
使用しないでください。execvp
心から、そうしないでください。シェルがコマンドを解釈する必要がある場合は、明示的に呼び出すことができます。
<key>ProgramArguments</key> <array> <string>/bin/bash</string> <string>-c</string> <string>~/bin/somecommand -xv "arg number 1" arg2 arg3 >>~/Desktop/somecommand.log</string> </array>
答え3
ディレクトリを見てください/usr/lib/cron
。jobs
/etc/cron.d