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が必要です。
最も重要なことは、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"
...
起動時にスクリプトを実行しますが、同様の問題がわずかに異なります。スクリプトは/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実行可能ファイルを直接指すことができるため、それほど重要ではありませんが、それでも興味があります。
完全なPATH
とJava_HOME
を/etc/environment
で明示的に設定しようとしましたが役に立ちませんでした。また、/etc/profile
で設定してみましたが、どちらも役に立たないようです。さまざまな場所でPATH
を設定した後、再度ログインとログアウトを試みました(ええと!)。
とにかく、おそらく単純な1行の解決策があるものについての長い投稿:(これに関する助けは大歓迎です、私は自分でそれを修正しようと非常に長い時間を費やしました。
モチベーション
最初の問題はわかりにくいように思われるかもしれませんが、私のシステムにはSSHアクセスが許可されていないユーザーがいますが、それでもプロセスを実行したいと思っています。このように動作するスクリプトがたくさんあるので、それらすべてを変更します。
参照: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 /は、ソースビルドパッケージをインストールするのに適した場所です...
猫の皮を剥ぐ方法は他にもあります。
含む:
(アップグレードや依存関係のインストールに注意してリセットしてください。良い選択ではありませんが、機能します)
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
これが妨げになるのではなく役立つことを願っています
ピート
一度に多くの質問がありますが、:
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
を使用すると、通常どおり、生成されたサブプロセスでも変数を使用できます)。
あなたが使用することができます
Sudo -u <user> -i
.bashrc
/.bash_profile
。