🐤

launchd で、実行時に executable file not found in $PATH となる

2022/05/22に公開

エラー

/usr/local/bin にあるモジュールを使用したいが、パスが通っておらず、エラーになる。

panic: failed to start service: failed to run command: exec: "chromedriver": executable file not found in $PATH

goroutine 1 [running]:
main.main()
        /Users/shinnosuke/Project/shinnosuke/koe/main.go:21 +0x250

原因

パスが通っていないから。
通常のシェルへのログインでは、 /etc/profile が読まれ、 /usr/local/bin へのパスが通される。

https://zenn.dev/shinji/articles/0eaad9d8c0954f

launchd ではシェルへのログインをしないのか、この /etc/profile が読まれず、普段シェルを操作する時に通っているパスが通っていない。

解決

環境変数の設定で無理やりパスを通した。
これで動いた。

<key>EnvironmentVariables</key>
<dict>
    <key>PATH</key>
    <string>$PATH:/usr/local/bin</string>
</dict>

launchctl config とか launchctl setenv とかでもうちょっと上手くやれそうだが、この定期実行タスク以外の設定に影響を与えたくないので一旦これで。

おまけ

原因調査のために、launchd での実行プログラムを echo、パラメータを $PATH としたところ、

<key>ProgramArguments</key>
<array>
    <string>echo</string>
    <string>$PATH</string>
</array>

結果のファイルに

$PATH

と表示された。
環境変数が未設定なら、下記みたいな感じで空欄が表示されるかと思ったんだけどこの場合はそうではないらしい。

hoge@fuga:~$ echo $HOGE

参考

https://qiita.com/rsahara/items/7d37a4cb6c73329d4683

Discussion