我有包含以下程序参数的 LaunchAgent plist 文件
<key>ProgramArguments</key>
<array>
<string>/Applications/UniFi.app/Contents/PlugIns/jre1.8.0_121.jre/Contents/Home/jre/bin/java</string>
<string>-Djava.awt.headless=true</string>
<string>-Xmx1024M</string>
<string>-jar</string>
<string>/Applications/UniFi.app/Contents/Resources/lib/ace.jar</string>
<string>start</string>
</array>
当 Ubiquiti 的人员更新其应用程序时,嵌入式 Java 发行版(此例中为版本 jre1.8.0_121.jre)的初始路径会发生变化,但他们提供的安装并不包括 LaunchAgent 修改,所以我每次都必须手动完成。
我尝试放一些类似
<string>/Applications/UniFi.app/Contents/PlugIns/jre*.jre/Contents/Home/jre/bin/java</string>
…但是正如我在这里读到的,plist 文件中没有替换。
关于如何实现这一点,您有什么想法吗?这样,无论嵌入式发行版的更新版本如何,plist 文件都可以保持不变。
谢谢大家
答案1
我还没有测试过,但你应该能够添加<EnableGlobbing><true/>
到 plist 文件中,并使用通配符。从launchd.plist 手册页:
EnableGlobbing <boolean>
此标志导致启动使用glob(3)在调用之前更新程序参数的机制。
由于这似乎不起作用,我想到另一种可能性是运行 shell,并让它进行通配符扩展。您可以创建一个简短的脚本,并让 launchd 运行该脚本,或者直接使用bash -c
:
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>-c</string>
<string>exec /Applications/UniFi.app/Contents/PlugIns/jre*.jre/Contents/Home/jre/bin/java -Djava.awt.headless=true -Xmx1024M -jar /Applications/UniFi.app/Contents/Resources/lib/ace.jar start</string>
</array>
请注意,由于它是通过 传递给 shell 的-c
,因此整个命令(包括参数)必须作为单个长参数传递,并用空格分隔,而不是作为单独的参数传递。此外,我添加了,exec
这样 shell 将用 java 可执行文件替换自身,而不是作为(无用的)父进程挂起。