launchd plist 字符替换

launchd plist 字符替换

我有包含以下程序参数的 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 可执行文件替换自身,而不是作为(无用的)父进程挂起。

相关内容