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


84

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

回答:


136

launchdを使用するだけです。これは非常に強力なランチャーシステムであり、Mac OS Xの標準ランチャーシステムです(現在のOS Xバージョンはそれなしでは起動しません)。慣れていない人のためのlaunchd(又は一般的にOS Xを有する)、それは間雑種のようなものであるinitcronat、はsysvinit( )、および。これらすべてのプロジェクトのコンセプトを借用しながら、他では見られないものを提供します。init.dinetdupstartsystemd

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

システムタスクは

/Library/LaunchDaemons/

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

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

/Library/LaunchAgents/

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

ログインしいる場合にのみ実行される場合は、

~/Library/LaunchAgents/

ここで、〜はホームディレクトリです。これらのタスクは、コマンドラインまたはFinderでファイルをダブルクリックして自分で開始した場合と同じように、自分の権限で実行されます。

そこにも存在していることを注意/System/Library/LaunchDaemonsして/System/Library/LaunchAgents、しかし、いつものように、下のすべては/Systemあなたがそこに任意のファイルを配置してはならないOS Xで管理されているあなたは本当にあなたが何をしているか知っている限り、あなたは、そこに任意のファイルを変更してはなりません。Systemsフォルダーをいじくり回すと、システムが使用できなくなる可能性があります(システムの再起動を拒否する状態になります)。これらは、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が実行できるすべてのことを実行できます)。または、「OnDemand」を無効にして、launchdがプロセスを永続的に実行し続けるようにすることもできます(終了またはクラッシュした場合、launchdはすぐに再起動します) 。プロセスが使用できるリソースの量を制限することもできます(前述のように、Lingonはこれらすべての設定を優れたUIインターフェイスに表示します)。

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

また、コマンドラインから手動でタスクを有効/無効にすることもできます。

launchctl <command> <parameter>

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

plist形式launchctlコマンドラインツールに関するAppleのドキュメントを参照してください(形式/オプションはOS Xのリリースによって異なるため、OS Xのバージョンを上から選択できることに注意してください)。


ログインしていないときでも、ユーザーとして何かを実行したい場合はどうなりますか?それは可能ですか、それとも管理者に/ Library / LaunchDaemonsに何かを入れるように依頼する必要がありますか?
マークベイカー

@Mark:はい、管理者はこれを行う必要があり、UserNameキーとGroupNameキーは.plistファイルで適切に設定する必要があります。
スティーブフォリー

また、Leopard以降では、KeepAliveキーを優先してOnDemandが非推奨になっていることにも注意してください。詳細については、manlaunchd.plistを参照してください。
スティーブフォリー

1
LaunchControl soma-zone.com/LaunchControlは非常に便利で、ライセンスされたバージョンとの制限がないことがわかる限り、無制限の試用版があります。
BaneOfSerenity 2017

1
StartCalendarInterval2つの辞書の配列を持つ@MaciekRekは、キーMinuteと値が1回00と1回の両方で、30要求したとおりに実行されます。将来的にはコメントではなく質問として質問してください。そうすれば、最終的な辞書を表示することもできます(コメントではそれを行うことはできません)。このサイトはすべて質問をすることについてです。質問について誰かにヒントを与えたい場合は、質問へのリンクをコメントとして投稿してください。質問自体は投稿しないでください。
Mecki

46

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

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


11

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

  • 「スクリプトの実行」アクションで繰り返し発生するiCalアラーム
  • 発売
  • クーロン(リンク1リンク2

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


8

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

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

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

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


正直なところ、これは、それを実行し、先に進むことができる、優れた使いやすいインターフェイスです。時間が足りない場合は、これが最適な方法です。
Joshua Pinter8

4

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


少なくともmacOSCatalina(10.15.x)では、Automatorを介してカレンダーでタスクをスケジュールする方法を見つけることができませんでした。Lingonの方がはるかに良い結果が得られました(launchdへのインターフェースとして言及されている他の回答を参照してください)。
calvinf

2

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


1

参考までに:私はそれが単純さを欠いている間、cronはOSXでは過去のものです。それはパンサーの番犬でした。Tiger以来発売されています。したがって、Leopardを実行している場合、cronはオプションではありません。


0

cronを使用してタスクをスケジュールできます。

crontab -e

ジョブは次の形式で指定されます。

* * * * *  command to execute
│ │ │ │ │
│ │ │ │ └─── day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0)
│ │ │ └──────── month (1 - 12)
│ │ └───────────── day of month (1 - 31)
│ └────────────────── hour (0 - 23)
└─────────────────────── min (0 - 59)

例:

0 12 * * *  cd ~/backupfolder && ./backup.sh

cronタスクをインストールしたら、crontab-lを使用してタスクを一覧表示できます。

crontab -l

cronスケジュール式について詳しく知りたい場合は、

https://crontab.guru https://ole.michelsen.dk/blog/schedule-jobs-with-crontab-on-mac-osx.html

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.