Yosemiteでスクリプトを定期実行

Mac OS X では,スクリプトの定期的な実行に,以下の3つの方法があるらしい.

  • crontab –– 私の環境では,crontab –e で編集した結果が保存されなかった.
  • launchd –– ちょっとググった感じでは,スクリプトの登録にxmlの編集が必要そうでパス.
  • Automator+iCal –– launchdより楽そうと思って手を出したら,酷い手間がかかった.

とはいえ,Automator+iCalにトライした.

Automator

Automatorは,複数の手順を経て実行する作業をダブルクリックの一発にまとめるためのスクリプトメーカーという感じのアプリで,そのスクリプトをappファイルに落とせる.
後に出てくるiCalは,yosemiteでは「カレンダー」という名前になっているが,昔のiCalとは違ってスクリプトを直接実行させる選択肢がないっぽいので,Automatorを使わざるを得ない.
Automatorの実行環境はシェルとは異なるので,シェルの設定ファイルをスクリプト内で読み込ませるか,あるいは全てのコマンドをフルパスで書くような工夫が必要かも知れない.
macportsでssh,rsyncなどを入れている私は,フルパスで書くことにした.
rsyncからsshの秘密鍵ファイルを開いて公開鍵認証を空パスで実行するということをするためには,環境変数がどうもうまく動いていないっぽいので,こんな風に呼んでやらないといけない.
以下,macportsを/opt/usr/local/binに入れている場合.

#!/bin/sh
/opt/usr/local/bin/rsync -rptgoDz -e '/opt/usr/local/bin/ssh -i /Users/USERNAME/.ssh/id_rsa' --include 'Downloads/ここだけよ/' --exclude 'Downloads/*' /Users/USERNAME USERNAME@DESTSERVER:path/to/dir

ここで,rsyncのオプションに–aを使っていないのは,リモートがwindows系のファイルシステムになっている外付けHDDを使っていて,symbolic linkのコピーができずエラーを吐くため.
エラーが出てもコピーは実行されるが,Mac OS X上にエラーが通知されるのが不快なので,リンクはコピーしないことにした.
どうもrsyncでリンクをコピーしないというオプションがないっぽく(そもそも–lをつけなきゃいいんだし),オプションが長くなってしまった.
ついでにちょっと書いたincludeとexcludeは,rsyncのinclude/exclude指定が難しいので,備忘のため.
この辺の記事が,詳しい→rsync の複雑怪奇な exclude と include の適用手順を理解しよう - てっく煮ブログ

iCal

カレンダーとか一般名詞のアプリにされたせいで,こいつを識別して呼ぶのが難しくなって,今後はweb上のtipsが減っていくであろう,iCal.
どうでもいいけど,AndroidもMac OS Xも,アプリの名前をこういう一般名詞にしやがるせいで,一般人はおろか技術者でも技術文書の検索が難しくなってしまった.
バッドノウハウへのアクセス手段を断ってやるぜ,HEHEHE…という発想は分からんでもないが,使われんくなっては仕方なかろう.アホめ.

カレンダーというアプリがiCalのことだ,ということと,スケジュールの登録をして,通知方法をアプリ実行にすればいいんだということが分かれば,特段難しいことはない.
通知方法を複数書けるので,例えばDBのdumpとバックアップなどのように時間差をおいて実行したい手順を順に実行させるのに,2つもスケジュールを登録する必要はない.
iCalの頃は,iCalAlarmSchedulerとかいうのをMac OS Xログイン時に起動するようにしないといけなかったらしいが,どうもカレンダーになってからは不要のようだ.
iCalAlarmSchedulerをシステム環境設定の「ユーザとグループ」から起動項目に追加するという古い情報に踊らされて(しかも,昔はユーザとグループからではなくアカウントからだった),だいぶハマってしまった.
いちいち,設定項目の名前も変えんな,クソOSめ.

mac os xも使えるようにと動かしているが,使う度にクソOSだと思う.

Mac OS X で GNU のコマンド

# port install coreutils,findutils,binutils

このままだと,lsがglsとかfindがgfindとなっているので,対策.

coreutils 関連:
/path/to/libexec/gnubin を $PATH の前の方に追加
bin/findutils関連:
$ port contents binutils | perl -nle 'print "alias $1=g$1" if m{/opt/local/bin/g(\w+)}' >> .alias

で alias を張る.
コマンド長いから,適当にコピって見てちょ.

参考:
Mint's log: Macportsのcoreutilsコマンド群はなんでも「g」から始まる
MacでGNUのコマンド群を使う - katz's adversaria

MacPorts + proxy

追記:
自分がまたハマったから,ちゃんと書こう.

  1. macportsをThe MacPorts Project –– Download & Installation(公式)から落としてインストールする.
  2. macportsのproxy設定
    112a113
    > rsync_server            sea.us.rsync.macports.org
    164c165
    < #proxy_override_env  	no
    ---
    > proxy_override_env  	yes
    169,172c170,173
    < #proxy_http          	proxy1:12345
    < #proxy_https         	proxy2:67890
    < #proxy_ftp           	proxy3:02139
    < #proxy_rsync         	proxy4:11377
    ---
    > proxy_http          	hoge:123
    > proxy_https         	hoge:123
    > proxy_ftp           	hoge:123
    > proxy_rsync         	hoge:123
    
  3. macportsのサーバの変更(ports.tar)

    32c32
    < rsync://rsync.macports.org/release/tarballs/ports.tar [default]
    ---
    > rsync://sea.us.rsync.macports.org/release/tarballs/ports.tar [default]
    

追記おわり

もう,Proxy越しのMacPorts update - そこはかとなく書くよ。の記事が必要十分なので,追加することなんてほとんどない.
一応,RSYNC_PROXY を知らなかった私のメモとして,こいつに指定するのは socks_proxy ではなくて,http_proxy だよってことくらいか.

簡単だね!

proxy越しでmacportsを使うにはいろいろな方式が色々なBlogに記載されていてわけわからないんだけれども、今これを試したらできました。
/opt/local/etc/macports/macports.conf
の最後に書かれている、proxy部分のコメントをはずし、書き換えます。

from Proxy越しのMacPorts update - そこはかとなく書くよ。

あと,デフォで設定されてる rsync.macports.org は日本からは鬼遅いので,ミラーを指定した方がいいよ.
バックボーン考えると,US あたりがいいんじゃないかな,かな.