После некоторых исследований и опробования различных исправлений, кажется, решение было номером 6 на «Почему мое приложение не работает под systemd, когда я могу запустить его напрямую? ».
Вместо использования
ExecStart=/home/alex/apache-maven-3.6.1/bin/mvn exec:java -Dexec.mainClass="org.jitsi.sphinx4http.server.HttpServer"
Мне нужно было использовать линию
ExecStart=/bin/bash -c '/home/linguini/apache-maven-3.6.1/bin/mvn exec:java -Dexec.mainClass="org.jitsi.sphinx4http.server.HttpServer"'
Важной частью было выполнение /bin/bash -c ''
для запуска команды в соответствующей оболочке.
Было бы проще использовать zsh
как локальную, так и удаленную оболочку:
ssh root@$RMT_IP zsh << EOF
set -o extendedglob # for (#c10)
for file in ${(qq)BASE_NAME}-[0-9](#c10).${(qq)FILE_EXTENSION}(N); do
tar -rf ${(qq)BASE_NAME}.tar \$file --remove-files
done
EOF
[0-9](#c10)
соответствует последовательности из 10 десятичных цифр.См. также [0-9]##
то же, что [0-9](#c1,)
для одной или нескольких цифр или <100000-9999999999>
(, который не требуетextendedglob
)для последовательностей десятичных цифр, составляющих числа в этом диапазоне.
sshd
На сервере запускается оболочка входа пользователя для интерпретации кода, переданного в качестве аргумента. Поскольку мы не знаем, что это (часто для root
, это просто sh
), мы просто делаем этот код zsh
, чтобы запустить оболочку zsh
и передать код zsh
на стандартный ввод.
Использование здесь -документа, подобного этому, упрощает создание кода оболочки, который будет интерпретироваться удаленной оболочкой. Поскольку EOF
не указан в кавычках, локальная оболочка будет выполнять расширения локально.
Важно отслеживать, какие расширения должны выполняться локально, а какие — удаленной оболочкой.
Выше ${(qq)BASE_NAME}
расширяется локальной оболочкой, мы используем флаг расширения параметра (qq)
, чтобы заключить результат в одинарные кавычки, чтобы удаленная оболочка восприняла его как литеральную строку.
$file
должен быть расширен удаленной оболочкой, поэтому мы добавляем к нему префикс \
, чтобы литерал $file
передавался удаленной оболочке.
Если zsh
недоступен на удаленном компьютере, а bash
есть, вы можете выполнить (по-прежнему, используя zsh
локально):
ssh root@$RMT_IP bash --norc << EOF
shopt -s extglob nullglob # for +(...)
export LC_ALL=C
for file in ${(qq)BASE_NAME}-+([0-9]).${(qq)FILE_EXTENSION}; do
tar -rf ${(qq)BASE_NAME}.tar "\$file" --remove-files
done
EOF
bash
не имеет эквивалента оператора glob zsh
x(#c10)
, но с extglob
он поддерживает подмножество операторов ksh (, а не {10}(x)
, хотя, к сожалению, здесь ), включая +(x)
который соответствует одному или нескольким x
. Так что +([0-9])
будет соответствовать одной или нескольким цифрам, а не только 10.
Чтобы сопоставить 10 цифр, вы все еще можете использовать [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
.