OSXで/etc/cron.d/エミュレーション

OSXで/etc/cron.d/エミュレーション

ほとんどの最新の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/cronjobs/etc/cron.d

関連情報