Se eu exportar uma variável de ambiente em scripts de inicialização, ela persistirá?

3

Quando eu crio um script de inicialização em /etc/init.d e faço um export de uma variável, essa variável persiste e é "visível" para o processo iniciado?
Para ser específico, eu tenho o seguinte script para iniciar o tomcat no init.d, que eu inicio manualmente com 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   

Agora, no Tomcat, estou usando o pool de conexão e, quando uso uma URL absoluta, tudo funciona bem. Por exemplo: url="jdbc:h2:file:/home/apache-tomcat-7.0.25/webapps/myDB;SCHEMA=mySchema"

Mas, se eu usar um URL relativo, ou seja, $CATALINA_HOME no URL, ou seja, url="jdbc:h2:file:$CATALINA_HOME\webapps\myDB;SCHEMA=mySchema" , isso NÃO funcionará e eu receberei a exceção JNDI.
Observe que no meu script eu exportei $CATALINA_HOME para ser /home/apache-tomcat-7.0.25

Parece que o $CATALINA_HOME não está definido para a instância inicial do Tomcat.
Poderia ser este o caso? Alguém tem uma idéia porque o URL com a variável de ambiente não funciona?

    
por Jim 29.02.2012 / 09:18

1 resposta

6

Quando um novo processo é criado, o ambiente é copiado do pai. Portanto, quaisquer variáveis de ambiente que você definir no script antes de iniciar outro processo devem existir.

Alguns programas como su/sudo fazem alguma filtragem do ambiente dependendo de como são chamados, como medida de segurança. Portanto, seu script de inicialização está chamando su , que está iniciando $CATALINA_HOME/bin/startup.sh , o que, na verdade, está acontecendo na inicialização do Tomcast. Algo provavelmente está removendo ou ignorando a variável.

Eu me pergunto por que você está chamando usando su root dentro de um script de inicialização. Os scripts de inicialização são executados como root por padrão, não deve haver motivo para você precisar se tornar root novamente. Se eu fosse você, deixaria cair o que parece ser uma chamada sem valor para su .

Apenas para ajudar você a solucionar problemas. Como root, no Linux, quando você tem /proc montado, pode ver qual é o ambiente atual.

Por exemplo, se o tomcat tiver um ID de processo de 1234, convém dar uma olhada no conteúdo de /proc/1234/environ . Qualquer coisa que esteja definida deve estar lá.

    
por 29.02.2012 / 10:29