Problema do caminho da classe de script Bash com java

0

Conteúdo de /opt/scripts/jvm/jvm.script.sh

#!/bin/bash
JAVA_HOME='/java'
PATH="$PATH:/$JAVA_HOME/bin"
java -cp ./classes:./lib com.mystuff.bar.foo.myclass &

Conteúdo de /etc/init.d/init.script.sh

home='/opt/scripts/jvm'
program=jvm.script.sh
su scriptuser -c "$home/$program"

/opt/scripts/jvm é um link simbólico para /data/shellscripts (o que significa que /data/shellscripts existe como um diretório real).

A execução do script de inicialização falha com cannot find class com.mystuff.bar.foo.myclass mas se eu sugo para o mesmo usuário e o executo, funciona, por quê?

Quando eu executo su scriptuser -c 'declare -p JAVA_HOME' , recebo JAVA_HOME not found , mas se eu sugo ao usuário primeiro (usando su scriptuser ) e o executo, recebo JAVA_HOME="/java"

Isso pode parecer loucura, mas parece corrigir o problema se eu adicionar uma barra final à variável home no script de inicialização.

Então:

home='/opt/scripts/jvm'

torna-se

home='/opt/scripts/jvm/' 

Parece quase que algo ambiental está mexendo com o modo como os links simbólicos estão sendo manipulados.

    
por Gregg Leventhal 24.11.2014 / 22:24

1 resposta

1

É uma questão confusa com os caminhos e su'ing. Quando você executa este comando:

$java -cp ./classes:./lib com.mystuff.bar.foo.myclass

E receba 'class not found', isso significa que java não é capaz de encontrar essa classe em ./classes ou ./lib. Se você quer

a) use caminhos absolutos ou b) cd no lugar certo antes de executar o comando (su scriptuser -c "cd $ home; ./$ program")

funcionará de forma mais confiável.

Por que adicionar um "/" ao home faz a diferença, isso parece muito estranho. Você poderia quebrar strace / truss e ver qual sistema chama o comando está fazendo. Esta resposta cita a especificação do posix:

Como o linux lida com vários separadores de caminho (/ home //// username /// file)

e diz "Para programas que atuam em uma entrada de diretório, se foo é um link simbólico para um diretório, então passar foo / é uma maneira de fazer o programa agir no diretório em vez do link simbólico."

    
por 25.11.2014 / 16:23