start-stop-daemon, сервисы, переменные среды и недоступные

Итак, у меня есть Java-программа, которая запускает Ansible. Я хотел бы запустить эту программу как услугу. Я написал сценарий службы в /etc/init.d, который использует start-stop-daemon для запуска / остановки программы Java. Я столкнулся с проблемой, когда Ansible терпит неудачу с этой ошибкой:

  СБОРНЫЕ ФАКТЫ ************************************************ *************** 
 fatal: [i-0f55b6a4] => Не удалось сделать dir /$HOME/.ansible/cp: [Errno 13] Разрешение отклонено: '/ $ HOME'

Ansible пытается создать временную рабочую директорию в каталоге /$HOME но по какой-то причине $HOME не оценивает /home/ubuntu (даже если я использовал --user ubuntu --chuid ubuntu при запуске службы), поэтому он выглядит например Ansible пытается создать каталог с буквальным именем /$HOME . И тогда он терпит неудачу, потому что у него нет разрешения на это.

Это не конфигурируемый вариант, поэтому я сделал некоторые копания, и я думаю, что нашел точно, где Ansible пытается это сделать: https://github.com/ansible/ansible/blob/5ce3988d8693357f671f3fbec43b2d3b862db5f6/v1/ansible/runner/connection_plugins/ ssh.py # L56

Фрагмент python, если эта связь когда-либо испортится:

 def __init__(self, runner, host, port, user, password, private_key_file, *args, **kwargs): ... fcntl.lockf(self.runner.process_lockfile, fcntl.LOCK_EX) self.cp_dir = utils.prepare_writeable_dir('$HOME/.ansible/cp',mode=0700) fcntl.lockf(self.runner.process_lockfile, fcntl.LOCK_UN) 

Я пробовал пару вещей, чтобы решить эту проблему, но пока ничего не получилось.

Некоторые из вещей, которые я пробовал, включают:

Использование /usr/bin/env для установки HOME (поскольку моя версия start-stop-daemon, похоже, не поддерживает --env ):

 CMD="/usr/bin/java" CMD_ARGS=#...not really relevant here case "$1" in start) start-stop-daemon --start -b -m --no-close --pidfile $PID_FILE --user ubuntu --chuid ubuntu --exec /usr/bin/env HOME=/home/ubuntu -- $CMD $CMD_ARGS >> $LOG_FILE 2>&1 

Увы, это не сработало.

Я попытался создать сценарий оболочки, который установит переменную, а затем выполнит основную программу:

 case "$1" in start) sudo cat << PROCESS_RUNNER > /tmp/runMyProcess.sh #! /bin/bash HOME=/home/ubuntu env $CMD $CMD_ARGS >> $LOG_FILE 2>&1 PROCESS_RUNNER sudo chmod a+x /tmp/runMyProcess.sh start-stop-daemon --start -b -m --no-close --pidfile $PID_FILE --user ubuntu --chuid ubuntu --exec /tmp/runMyProcess.sh 

Скрипт оболочки выглядит следующим образом:

 #! /bin/bash HOME=/home/ubuntu env /usr/bin/java -cp /home/ubuntu/arch3/pancancer.jar com.mypackage.MyClass --some --arguments >> /var/log/myApplication/MyClass.log 2>&1 

Это тоже не сработало.

Когда Java-программа вызывается непосредственно из командной строки, все работает нормально.

Ansible вызывается из Java-программы, которая вызывается из start-stop-daemon, которая вызывается из службы. Я не уверен, как я могу распространять переменную окружения с именем $HOME на доступную, и сейчас я немного тупик.

Linux и Unix - лучшая ОС в мире.