3

Когда я создаю сценарий запуска в /etc/init.d и выполняю export переменной, сохраняется ли эта переменная и является ли "видимой" для запущенного процесса?
Чтобы быть точным, у меня есть следующий скрипт для запуска tomcat в init.d, который я запускаю вручную при start:

#!/bin/bash
RETVAL=$?
export JRE_HOME=/home/jre
export PATH=/home/jre/bin/:${PATH}
export CATALINA_HOME=/home/apache-tomcat-7.0.25
case "$1" in
 start)
        if [ -f $CATALINA_HOME/bin/startup.sh ];
          then
            echo $"Starting Tomcat"
            /bin/su root $CATALINA_HOME/bin/startup.sh
        fi
        ;;
 stop)
        if [ -f $CATALINA_HOME/bin/shutdown.sh ];
          then
            echo $"Stopping Tomcat"
            /bin/su root $CATALINA_HOME/bin/shutdown.sh
        fi
        ;;
 restart)
        if [ -f $CATALINA_HOME/bin/shutdown.sh ];
          then
            echo $"Stopping Tomcat"
            /bin/su root $CATALINA_HOME/bin/shutdown.sh
        fi
        if [ -f $CATALINA_HOME/bin/startup.sh ];
          then
            echo $"Starting Tomcat"
            /bin/su root $CATALINA_HOME/bin/startup.sh
        fi
        ;;        
 *)
        echo $"Usage: $0 {start|stop}"
        exit 1
        ;;
esac
exit $RETVAL   

Теперь в Tomcat я использую пул соединений, и когда я использую абсолютный URL, тогда все работает нормально. Т.е.: url="jdbc:h2:file:/home/apache-tomcat-7.0.25/webapps/myDB;SCHEMA=mySchema"

Но если я использую относительный URL, то есть $CATALINA_HOME в URL, то есть url="jdbc:h2:file:$CATALINA_HOME\webapps\myDB;SCHEMA=mySchema" это НЕ работает, и я получаю исключение JNDI.
Обратите внимание, что в моем скрипте я экспортировал $CATALINA_HOME в /home/apache-tomcat-7.0.25

Похоже, что $CATALINA_HOME не установлен для запущенного экземпляра Tomcat.
Может ли это быть так? У кого-нибудь есть идея, почему URL с переменной окружения не работает?

1 ответ1

6

Когда создается новый процесс, среда копируется из родительского. Таким образом, любые переменные окружения, которые вы устанавливаете в скрипте перед запуском другого процесса, должны существовать.

Некоторые программы, такие как su/sudo будут выполнять фильтрацию среды в зависимости от того, как они называются, в качестве меры безопасности. Итак, ваш скрипт инициализации вызывает su который $CATALINA_HOME/bin/startup.sh , который, как я полагаю, фактически запускает Tomcast. Что-то, вероятно, удаляет или игнорирует переменную.

Мне интересно, почему вы звоните с помощью su root из сценария инициализации. По умолчанию init-скрипты запускаются с правами суперпользователя. Не должно быть никаких причин, по которым вам нужно снова стать root-пользователем На вашем месте я бы отбросил то, что кажется бесполезным призывом к su .

Просто чтобы помочь вам устранить неполадки. Как пользователь root, в Linux, когда вы установили /proc , вы можете посмотреть текущую среду.

Например, если tomcat имеет идентификатор процесса 1234, вы можете взглянуть на содержимое /proc/1234/environ . Все, что установлено, должно быть там.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .