launchdでPATHをうまく追加できずにハマった
2018-08-07 | カテゴリ >> macでのエンジニアリング的な何か

最近macで定期的に実行する処理を作りました。
いままでcronでやるものだと思いこんでたのですが、ちょっと調べてみるとlaunchdでやるのが一般的だそう。
てか、launchdの存在自体初めて知った。

基本的にはこの秀逸なまとめ記事を読むとサクっと追加できると思われます。
自分のuserで実行させたければ~/Library/LaunchAgents にplistを置いておけばOKの模様。

今回ここでrubyのファイルを実行させるようにした、、 ところ早速つまづく。
Capybaraでfirefoxを動かしてクロールさせたかったのだけども、

Unable to find Mozilla geckodriver. Please download the server from https://github.com/mozilla/geckodriver/releases and place it somewhere on your PATH.

と、怒られてしまう。
PATHに入っていないようですね。 よくあるやつや。

ところで、rubyで今見てるPATHの中身確認する手軽な方法ってなんだろう〜 と思っていた矢先、
Errorになってる辺りの箇所でこんな処理が…

def find_binary(*binary_names)
  paths = ENV['PATH'].split(File::PATH_SEPARATOR)

なるほど、 ENV[‘PATH’]で良かったのか。
ここで、paths をログに出してみると、launchdで動かしたときは /user/local/bin が入っていない。
やはり。

再びネットの大海原を双眼鏡で覗いてみると、大まかに2通りやる方法があるっぽいですね。

PATHを追加する方法その1

launchd でsetenv するためのplistを作成する。

こんな方法があるようだ。
https://apple.stackexchange.com/questions/106355/setting-the-system-wide-path-environment-variable-in-mavericks

PATHを通すためだけのplistをLaunchAgentsに入れてやるだけで良さそう。
↓ここで、好きなPATHを追加するということか。

<string>sh</string>
<string>-c</string>
<string>launchctl setenv PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>

RunAtLoadとかいうKeyをTrueとして設定しているので、Lauchdが何かのplist(というかjobって言ったほうが正しい?)を実行するたびにやってくれるのでしょう。(きっと)
これだと全部のplistに影響がありそうなので、なんとなく自分は2番目の手法を採用しました。

PATHを追加する方法その2

dict > key > PATH というxmlの要素を追加。

参考にしたのはこちら
https://scrapbox.io/shokai/Sierra%E3%81%A7launchd%E3%81%ABpath%E3%81%8C%E9%80%9A%E3%82%89%E3%81%AA%E3%81%84

メインのprogramのところと同じ階層で

     <dict>
       <key>PATH</key>
       <string>/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin</string>
       <key>DEBUG</key>
       <string></string>
     </dict>

を追加してあげてもいいようです。
これだと、対象の処理だけ適切にPATHを追加できそう。

というわけで、launchd毎日元気に動いています。
動いていますが、忘れた頃にいきなり画面にFirefoxがババーンて出てきてウットオシイ。
次はこれを何とかしたい。

おわりでーす。

 

2018-08-07 | カテゴリ >> macでのエンジニアリング的な何か 

関連記事

Comment





Comment



*