У меня есть файл 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, а не останется (бесполезным) родительским процессом.