Estoy tratando de hacer que la actualización 3 de Oracle Java 7 funcione correctamente en Debian 6. He descargado y configurado los archivos /usr/java/jre1.7.0_03
. También he establecido las siguientes dos líneas al final de /etc/bash.bashrc
:
export JAVA_HOME=/usr/java/jre1.7.0_03
export PATH=$PATH:$JAVA_HOME/bin
Iniciar sesión como otros usuarios y root está bien, Java se puede encontrar:
chris@mc:~$ java -version
java version "1.7.0_03"
Java(TM) SE Runtime Environment (build 1.7.0_03-b04)
Java HotSpot(TM) 64-Bit Server VM (build 22.1-b02, mixed mode)
Sin embargo, hay dos casos en los que Java no se puede encontrar como se detalla a continuación. Tenga en cuenta que ambos funcionaron bien cuando anteriormente instalé OpenJDK Java 6 a través de aptitude, pero necesito Oracle Java 7 por varias razones.
Lo más importante, no puedo ejecutar comandos como otro usuario a través
su
, a pesar de que la RUTA muestra que Java debería estar presente. El usuario fue creado conadduser chris
root@mc:~# su chris -c "echo $PATH" /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/java/jre1.7.0_03/bin:/bin root@mc:~# su chris -c "java -version" bash: java: command not found root@mc:~# su chris -c "/usr/java/jre1.7.0_03/bin/java -version" java version "1.7.0_03" ...
¿Cómo puede estar en el
PATH
pero no se puede encontrar? Actualización 05/04/2012: explicada por Daniel, que tiene que ver con que es un shell no interactivo para que los archivos como/etc/profile
y/etc/bash.bashrc
no se ejecuten. Hacer un intercambio completo a ese usuario y ejecutar Java funciona:root@mc:~# su chris chris@mc:/root$ java -version java version "1.7.0_03" ...
Ejecuto un script en el inicio que muestra problemas similares pero ligeramente diferentes. El script se encuentra en
/etc/init.d/start-mystuff.sh
y llama a un jar:#!/bin/bash # /etc/init.d/start-mystuff.sh java -jar /opt/Mars.jar
Puedo confirmar que el script se ejecuta al inicio y que el código de salida es 127, lo que indica que no se encontró el comando. Insertar una línea para imprimir / guardar los
PATH
programas que es:/sbin:/usr/sbin:/bin:/usr/bin
Este segundo problema no es tan importante porque puedo señalar directamente el ejecutable de Java en el script, ¡pero todavía tengo curiosidad!
He intentado configurar el completo PATH
y JAVA_HOME
explícitamente en el /etc/environment
que no ayudó. También he intentado configurarlos en los /etc/profile
que tampoco parece ayudar. He intentado iniciar y cerrar sesión de nuevo después de configurar PATH
en varias ubicaciones (¡duh!).
De todos modos, una publicación larga para lo que probablemente tendrá una solución simple de una línea :( Cualquier ayuda con esto sería muy apreciada, he pasado demasiado tiempo tratando de solucionarlo por mí mismo.
Motivación
El primer problema puede parecer oscuro, pero en mi sistema tengo usuarios a los que no se les permite el acceso SSH pero todavía quiero ejecutar procesos como ellos. Tengo un montón de scripts que funcionan de esta manera y no quiero tener que cambiarlos todos.
update-alternatives --install /usr/bin/java jre7u3 /usr/java/jre1.7.0_03/bin/java 5
. También encontré otra forma de resolverlo usando,$BASH_ENV
pero las alternativas de actualización son las mejores. Actualizaré mi pregunta para que todo esto quede claro para cualquier otro visitante pronto. Editar: Parece que no puedo etiquetarte@
, supongo que mi calificación es demasiado baja.Muchas preguntas de una vez, pero:
1. Lo haces
Esto sustituirá la variable
$PATH
antes de ejecutar el comando, lo que dará la$PATH
raíz for. Tratarpara ver a qué me refiero.
En cambio, puedes hacer
lo que impedirá que el shell expanda la variable en el primer caso, y en su lugar obtendrá
chris
's$PATH
. Lo más probable es que descubras que los cambios no han penetrado en ese usuario.¿Por qué no entonces?
/bin/sh
está vinculado a los/bin/dash
sistemas Debian, y no/bin/bash
. Dash no leerá/etc/bash.bashrc
. Quizás obtuviste Dash como shell predeterminado para el usuariochris
cuando fue creado. Mire/etc/passwd
para ver si este es el caso.Quizás esto aclare también la pregunta 2.
ACTUALIZACIÓN: Ah,
/etc/bash.bashrc
solo se lee para shells interactivos. Lea laman bash
sección "ARCHIVOS". No inicia un shell interactivo cuando lo usasu
de esa manera.Actualización 2: este ejemplo es de una manera:
o similarmente:
(con
export
, la variable está disponible para subprocesos generados también, como de costumbre).fuente
"
lugar de'
, sin embargo: ¿chris:x:1001:1001:,,,:/home/chris:/bin/bash
indica que/bin/bash
es el shell predeterminado para lachris
derecha?$PATH
shells no interactivos? La sección "ARCHIVOS"man bash
indica que mis soluciones no funcionarán. Buscaré soluciones y actualizaré mi publicación si encuentro algo.Puedes usar
que leerá
.bashrc
/.bash_profile
.fuente