Назад | Перейти на главную страницу

Запуск подстановки символов plist

У меня есть файл Plist LaunchAgent, который содержит следующие аргументы программы

<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>

Первоначальный путь к встроенному java-дистрибутиву (в данном случае версия jre1.8.0_121.jre) изменяется, когда люди из Ubiquiti обновляют свое приложение, но установленный, который они предоставляют, не включает модификацию LaunchAgent, поэтому я должен сделать это рука каждый раз.

Я пробовал поставить что-то вроде

<string>/Applications/UniFi.app/Contents/PlugIns/jre*.jre/Contents/Home/jre/bin/java</string>

… Но, как я читал здесь, в файле plist нет замены.

Есть идеи, как этого добиться? Таким образом, файл plist может оставаться неизменным независимо от обновленной версии встроенного дистрибутива.

Спасибо вам всем

Я не тестировал, но вы сможете добавить <EnableGlobbing><true/> в файл plist и используйте подстановочный знак. Из страница руководства launchd.plist:

EnableGlobbing <boolean>

Этот флаг вызывает запуск использовать шарик (3) механизм обновления аргументов программы перед вызовом.

Поскольку это, похоже, не работает, мне пришла в голову еще одна возможность - запустить оболочку и разрешить ей расширение с подстановочными знаками. Вы можете создать короткий сценарий и запустить его при запуске или просто использовать 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>

Обратите внимание: поскольку он передается в оболочку через -c, вся команда (включая аргументы) должна передаваться как один длинный аргумент, разделенный пробелами, а не как отдельные аргументы. Также я добавил exec поэтому оболочка заменит себя исполняемым файлом java, а не останется (бесполезным) родительским процессом.