Macでスクリプトを自動実行する方法

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

なにを使おう?

Macでタスクやスクリプトを定期的に実行させたいけど、どういう方法があるだろう?

まずLinuxなどで利用するcronを使用しようと思ったがOS Xでは非推奨みたい。

Scheduling Timed Jobs

そこで、今回はlaunchdを利用してスクリプトの自動実行を検討してみる。

launchdとは?

launchdはデーモン、アプリケーション、プロセス、スクリプトの起動・停止・管理を行う、オープンソースのサービス管理フレームワークである。

Wikipedia

Linuxのcron、Windowsのタスクスケジューラに相当する機能だと考えれば良さそう。

設定してみる

スクリプトを用意

今回はテストとして特定のディレクトリのファイルを特定のディレクトリへコピーするスクリプトを作成し、それをlaunchdで定期的に実行させる。

スクリプトの保存場所はどこでもいいと思うが、仮に下記のディレクトリに保存する。

vi /Users/Me/scripts/copy.sh

copy.sh

#!/bin/bash
cp -R コピー元 コピー先

launchdの設定ファイルを作成

launchdの設定はプロパティリストファイル(.plist)で定義する。

設定ファイルの配置場所は用途によって異なる。

配置場所 用途
~/Library/LaunchAgents 各ユーザが管理するエージェントを設定
/Library/LaunchAgents 管理者が管理するエージェントを設定
/Library/LaunchDaemons 管理者が管理するデーモンを設定
/System/Library/LaunchAgents OSが管理するエージェントを設定
/System/Library/LaunchDaemons OSが管理するデーモンを設定

A launchd Tutorial

今回は ~/Library/LaunchAgents に配置しようと思う。

vi ~/Library/LaunchAgents/com.no-title.copy.plist

毎日9時半にスクリプト(copy.sh)を実行させる場合、下記のように記述する。






  Label
  com.no-title.copy

  ProgramArguments
  
    sh
    /Users/Me/scripts/copy.sh
  

  StartCalendarInterval
  
    Minute
    30
    Hour
    9
  

  StandardOutPath
  /Users/Me/scripts/copy.log
  StandardErrorPath
  /Users/Me/scripts/copy.log



キー 内容
Label サービスを識別するラベル
ProgramArguments 起動するサービスのパス及び引数を指定
StartCalendarInterval 実行日時を指定
StandardOutPath 標準出力ログの出力先
StandardErrorPath 標準エラーログの出力先

launchdへの登録

設定ファイルが記述できたら、さっそく登録してみましょう

launchctl load ~/Library/LaunchAgents/com.no-name.copy.plist

確認

登録を確認するには下記のコマンドを実行します。
指定するのはlabel名です。

launchctl list com.no-title.copy

登録解除

登録を解除する場合は下記のコマンドを実行します。

launchctl unload ~/Library/LaunchAgents/com.no-name.copy.plist

参考

Mac OS Xでlaunchdでcronのように定期実行するメモ – launchd.plistの作成とか – tweeeetyのぶろぐ的めも
launchctl unload ~/Library/LaunchAgents/pl.sample.perl.plist …

launchd.plistの書き方 | Drowsy Dog’s Diary
launchd の設定ファイル …

Undocumented Mac OS X:第1回 initを置き換えるlaunchd【前編】 (3/3) – ITmedia エンタープライズ

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。

コメントを残す

*

CAPTCHA