web-dev-qa-db-ja.com

DebianでJava)のPATHを設定する際の問題

Oracle Java 7 update3をDebian6で正しく動作させようとしています。/usr/Java/jre1.7.0_03のファイルをダウンロードして設定しました。また、次の2行を設定しました。 /etc/bash.bashrcの終わり:

export Java_HOME=/usr/Java/jre1.7.0_03
export PATH=$PATH:$Java_HOME/bin

他のユーザーとrootとしてログインしても問題ありません、Javaを見つけることができます:

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)

ただし、以下に詳述するようにJavaが見つからない場合が2つあります。以前にOpenJDK Java 6をaptitude経​​由でインストールした場合、これらは両方とも正常に機能しました。しかし、さまざまな理由でOracle Java 7が必要です。

  1. 最も重要なことは、PATHがJavaが存在する必要があることを示しているにもかかわらず、suを介して別のユーザーとしてコマンドを実行できないことです。ユーザーはadduser 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"
    ...
    

    どうしてPATHにあるのに見つからないのですか? 2012年5月4日更新:ダニエルによって説明されました。これは非対話型シェルであるため、/etc/profile/etc/bash.bashrcなどのファイルは実行されません。完全に実行するそのユーザーにスワップして実行中Java動作します:

    root@mc:~# su chris
    chris@mc:/root$ Java -version
    Java version "1.7.0_03"
    ...
    
  2. 起動時にスクリプトを実行しますが、同様の問題がわずかに異なります。スクリプトは/etc/init.d/start-mystuff.shにあり、jarを呼び出します。

    #!/bin/bash
    # /etc/init.d/start-mystuff.sh
    Java -jar /opt/Mars.jar
    

    スクリプトが起動時に実行され、終了コードが127であることを確認できます。これは、コマンドが見つからないことを示しています。 PATHを印刷/保存する行を挿入すると、次のようになります。

     /sbin:/usr/sbin:/bin:/usr/bin
    

    この2番目の問題は、スクリプト内のJava実行可能ファイルを直接指すことができるため、それほど重要ではありませんが、それでも興味があります。

完全なPATHJava_HOME/etc/environmentで明示的に設定しようとしましたが役に立ちませんでした。また、/etc/profileで設定してみましたが、どちらも役に立たないようです。さまざまな場所でPATHを設定した後、再度ログインとログアウトを試みました(ええと!)。

とにかく、おそらく単純な1行の解決策があるものについての長い投稿:(これに関する助けは大歓迎です、私は自分でそれを修正しようと非常に長い時間を費やしました。

モチベーション

最初の問題はわかりにくいように思われるかもしれませんが、私のシステムにはSSHアクセスが許可されていないユーザーがいますが、それでもプロセスを実行したいと思っています。このように動作するスクリプトがたくさんあるので、それらすべてを変更します。

2
milkmansrevenge

参照:update-alternatives

また、Debianは一般的に開発者がENV変数に依存することを思いとどまらせます。あなたはその理由の1つを発見しました。

それは彼らがタブーであるということではなく、彼らが常に利用可能であると期待されるべきではないということだけです。

注:既存のパスの最後にJavaパスを追加すると、他のJavaが最初に検出され、使用されます。

(つまり、/ usr/binの下の(シンボリックリンク))

そう:

ls -lah /usr/bin/Java

言う:

lrwxrwxrwx1ルートルート2011年4月22日/ usr/bin/Java->/etc/Alternatives/Java

file $(which Java)

/ usr/bin/Java: `/ etc/Alternatives/Java 'へのシンボリックリンク

file /etc/alternatives/Java

/ etc/Alternatives/Java: `/ usr/lib/jvm/Java-6-openjdk-i386/jre/bin/Java 'へのシンボリックリンク

** <副次的な問題>また、「バッククォートexecモード」または「evalthis」よりも$(サブシェルスタイルのexec)が望ましい理由を示すのにも役立ちます。

(( `` ''と ""は、少なくとも私にとっては混乱しすぎて、常にすべてのシェルで期待どおりに機能するとは限りません。POSIXモードAKA/bin/shを調べてください))

</副次的な問題> **

man update-alternativesこの代替システムが存在する理由を説明します...

その間

update-alternatives --config Java 

役立つかもしれません。

/ usr/local /は、ソースビルドパッケージをインストールするのに適した場所です...

猫の皮を剥ぐ方法は他にもあります。

含む:

  • / usr/bin/Javaリンクを手動で再ポイントします:)

(アップグレードや依存関係のインストールに注意してリセットしてください。良い選択ではありませんが、機能します)

  • Javaユーザーごと[1]のエイリアスを設定する

  • ユーザーの.bashrcに$ PATHを付加する

(必要に応じて、.bash_profileから.bashrcを入手できます)

  • インスタンスごとに特定のバージョンのフルパスを呼び出す

(最も安全な賭けですが、おそらく実用的ではありません)

[1] .aliasまたは.bashrc

help alias

(bashが組み込まれています)

最後に、良いか悪いかの例:私のDebian .bash_profile ..から引用.

# include .bashrc if it exists

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

# set PATH so it includes user's private bin if it exists
if [ -d ~/bin ] ; then
    PATH=~/bin:"${PATH}"
fi

これが妨げになるのではなく役立つことを願っています

ピート

3
petergozz

一度に多くの質問がありますが、:

1。あなたは

# su chris -c "echo $PATH"

これにより、コマンドが実行される前に変数$PATHが置き換えられ、ルートに$PATHが与えられます。試してみてください

# su chris -c "echo $HOME"

私が何を意味するかを見るために。

代わりに、あなたはすることができます

# su chris -c 'echo $PATH'

これは、最初のケースでシェルが変数を展開するのを妨げ、代わりに実際にはchris$PATHを取得します。ほとんどの場合、変更がそのユーザーに浸透していないことがわかります。

では、なぜですか? /bin/shは、Debianシステムでは/bin/dashにリンクされており、/bin/bashにはリンクされていません。ダッシュは/etc/bash.bashrcを読み取りません。おそらく、ユーザーchrisが作成されたときに、デフォルトのシェルとしてDashを取得しました。 /etc/passwdを調べて、これが当てはまるかどうかを確認してください。

おそらく、これは質問2も明らかにします。


PDATE:ああ、/etc/bash.bashrcはインタラクティブシェルに対してのみ読み取られます。 man bash、セクション「ファイル」をお読みください。 suをそのように使用する場合、インタラクティブシェルを開始しません。


更新2:この例は1つの方法です:

# su chris -c 'myvar="hi there"; echo $myvar'
hi there

または同様に:

# su chris -c 'export myvar="hi there"; echo $myvar; export | grep myvar'
hi there
declare -x myvar="hi there"

exportを使用すると、通常どおり、生成されたサブプロセスでも変数を使用できます)。

1

あなたが使用することができます

Sudo -u <user> -i 

.bashrc/.bash_profile

0
Rob