web-dev-qa-db-ja.com

タスクを頻繁に実行するように設定するにはどうすればよいですか?

たとえば30分ごとにスクリプトを実行するにはどうすればよいですか? OSごとに異なる方法があると思います。 OS Xを使用しています。

70
stalepretzel

launchdを使用します。これは非常に強力なランチャーシステムであり、一方でMac OS Xの標準のランチャーシステムです(現在のOS Xバージョンはそれなしでは起動しません)。 launchd(またはOS X全般)に慣れていない人にとっては、initcronat、SysVinit(init.d)、inetdupstart、およびsystemdの雑種のようなものです。これらすべてのプロジェクトの概念を借用すると同時に、他の場所にはないものを提供します。

すべてのサービス/タスクはファイルです。ファイルの場所は、「このサービスはいつ実行されるのですか?」という質問によって異なります。 「サービスにはどの特権が必要ですか?」

システムタスク

/Library/LaunchDaemons/

ユーザーがシステムにログインしているかどうかに関係なく、実行する必要がある場合。それらは「root」特権で開始されます。

anyユーザーがログインしている場合にのみ実行する場合は、

/Library/LaunchAgents/

そして、ログインしたばかりのユーザーの権限で実行されます。

youがログインしている場合にのみ実行する場合、

~/Library/LaunchAgents/

ここで〜は、HOMEディレクトリです。これらのタスクは、コマンドラインまたはFinderでファイルをダブルクリックして自分で開始したかのように、特権で実行されます。

/System/Library/LaunchDaemons/System/Library/LaunchAgentsも存在することに注意してください。ただし、通常、/Systemの下のすべてはOS Xによって管理されます。そこにファイルを配置したり、そこにファイルを変更したりしないでください。何をしているのか本当にわかっていない限り。 [システム]フォルダをいじると、システムが使用できなくなる可能性があります(再起動を拒否する状態になります)。これらは、Appleが起動中にシステムを起動して実行するlaunchdタスクを配置し、必要に応じてサービスを自動的に開始し、システムメンテナンスタスクを実行するなどのディレクトリです。

すべてのlaunchdタスクには、plist形式のファイルがあります。逆ドメイン名表記を使用する必要があります。例えば。タスクに名前を付けることができます

com.example.my-fancy-task.plist

このplistには、さまざまなオプションと設定があります。手ごとに1つ書くのは最適ではありません。無料のツール Lingon を入手してタスクを作成することをお勧めします。このツールは以前は無料でしたが、現在はアプリストアで5ドル、非アプリストアバージョンで10ドルです(非アプリストアバージョンははるかに強力で、既に支払いを計画している場合は、真剣に非アプリストアを取得しますバージョン)。フリーウェアまたはオープンソースである同等のツールを知っている人がいれば、コメント欄に一行書いてください。私はむしろそれをお勧めします(ここで商用ソフトウェアについて宣伝したくない)。

例として、このように見えるかもしれません

<?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.example.my-fancy-task</string>
    <key>OnDemand</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/usr/local/bin/my-script.sh</string>
    </array>
    <key>StartInterval</key>
    <integer>1800</integer>
</dict>
</plist>

このエージェントは、シェルスクリプト/usr/local/bin/my-script.shを1800秒ごと(30分ごと)に実行します。また、特定の日付/時間にタスクを実行することもできます(基本的に、launchdはcronが実行できるすべてのことを実行できます)。 。プロセスが使用できるリソースの量を制限することもできます(前述のとおり、Lingonはこれらすべての設定をNice UIインターフェースで表示します)。

更新:OnDemandはまだサポートされていますが、非推奨です。新しい設定の名前はKeepAliveで、これははるかに理にかなっています。ブール値を持つことができます。この場合、OnDemandとは正反対です(falseに設定すると、OnDemandtrueであるように動作し、逆の場合も同様です)。すばらしい新機能は、ブール値の代わりに辞書値を持つこともできることです。ディクショナリ値がある場合、いくつかの追加オプションを使用して、どの状況下でタスクを存続させるかをよりきめ細かく制御できます。例えば。プログラムが終了コード0で終了した場合、ディスク上の特定のファイル/ディレクトリが存在する場合、別のタスクも生存している場合、またはネットワークが現在稼働している場合にのみ、生存します。

また、コマンドラインを使用してタスクを手動で有効/無効にすることができます。

launchctl <command> <parameter>

commandは、plistをロードするか、再度アンロードするためのロードまたはアンロードです。この場合、パラメーターはファイルへのパスです。または、そのようなタスクを単に開始または停止するために、コマンドを開始または停止することができます。この場合、パラメーターはラベルです(com.example.my-fancy-task)。他のコマンドとオプションも存在します。

plist format および launchctlコマンドラインツール のAppleのドキュメントを参照してください(フォーマット/オプションは異なるため、OS Xバージョンを選択できることに注意してください) OS Xリリース)

113
Mecki

非常に便利なplistジェネレーターを使用できます。 http://launched.zerowidth.com/ (何も購入する必要はありません…)

既に推奨されているlaunchdで新しいスケジュール済みジョブを登録するためのシェルワンライナーが提供されます

37
Kosmotaur

MacOSXでは、少なくとも次のオプションがあります。

  • 「スクリプトの実行」アクションを伴う繰り返しiCalアラーム
  • launchd
  • cron( link1link2

個人的な経験から、cronは最も信頼性が高いものです。私がテストしたとき、launchdには多くのバグと癖がありました。 iCalアラームは、ログインしている場合にのみ実行されます(ただし、それが望ましい場合があります)。

11
Bruno De Fraine

Meckiが指摘したように、launchdはこれに対応する方法です。 launchdファイルを手動で編集するのではなく、 Lingon と呼ばれるlaunchd用のGUIインターフェースがあります。

Lingonは、Mac OS X Leopard 10.5用の起動設定ファイルの編集を作成するためのグラフィカルユーザーインターフェイスです。

[をちょきちょきと切る...]

このバージョンでは、構成ファイルの編集がこれまでになく簡単になり、2つの異なるモードがあります。最も一般的な設定が非常にシンプルなインターフェイスですぐに利用できる基本モードと、すべての設定をテキストに直接追加するか、メニューから挿入できるエキスパートモード。

6
Jay

MAC OSには、AutomatorTask Schedulerと同じツールがありますWindowsで。 Automatorを使用すると、毎日タスクをスケジュールし、タスクを定期的なカレンダーイベントにリンクして、毎日指定された時間にスクリプトを実行できます。参照リンク Mac OSでスクリプトを毎日実行するため

3
Jlearner

Appleスクリプトの場合、特別なiCalカレンダーを設定し、アラームを使用して定期的に実行します。コマンドラインツールの場合は、launchdを使用します。

2
Mike Heinz

参考までに、私はそれがシンプルであることを見逃していますが、cronはOS Xでは過去のものです。それはパンサーの番犬でした。 Tigerから発売されました。したがって、Leopard cronを実行している場合、オプションはありません。

1
joelbrock