🐤
launchd で、実行時に executable file not found in $PATH となる
エラー
/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
へのパスが通される。
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
参考
Discussion