web-dev-qa-db-ja.com

ルートの環境変数を指定する方法は?

Rails開発です。このアプリでは、環境変数LD_LIBRARY_PATH = /usr/local/Oracle/libを指定する必要がありますが、Sudoスクリプト/サーバーでアプリを実行すると、そのため実行されません。ライブラリパスがルートの環境にありません。

機能させるにはどうすればよいですか?ルート./bashrcの下にパスを配置しようとしましたが、機能しませんでした。

4
Wendy

同様の問題がありました。私は/etc/sudoersファイルと私はこれらの行を見た:

 Defaults env_reset 
 Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR\
 LS_COLORS MAIL PS1 PS2 QTDIR USERNAME\
 LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTICATION ] LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC\
 LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS\
 _XKB_CHARSET XAUTHORITY "

私の環境変数を取得するには、 "XAUTHORITY"の後にその名前を追加する必要がありました。あなたのケースでは:

デフォルトenv_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR\
 LS_COLORS MAIL PS1 PS2 QTDIR USERNAME\
 LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION\[.____。LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASARY LC_MEASURE 
 LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS\
 _XKB_CHARSET XAUTHORITY LD_LIBRARY_PATH "

試してみてください。

また、BASH_ENV="~/.bashrc" in /etc/environment

詳細については、この他の回答を参照してください

6
Fab

クレイジーなアイデアですが、サーバーが実際にrootとして実行されていることを確信していますか?一部のサーバーは、実行に使用するアカウントを指定しているため、起動スクリプトをrootとして呼び出しても、実際には別のユーザーとして実行されています。

1

Rootユーザーに到達する方法はここで重要です。 「ログイン」するための異なる方法は、異なる環境を作成します。

例えば:

  • Bashがルートシェルの場合、.bashrc起動時
  • Bashがルートシェルで、「ログイン」シェルの場合、.bash_profile起動時
  • Ssh経由でログインしている場合は、.ssh/environment 同じように
  • ログインを介してログインしている場合、つまりコンソールからログインしている場合は、/etc/pam.d/loginは、pam_env.soを使用して/etc/security/pam_env.conf(ディストリビューションによって異なります)および/ etc/environment(readenv = 1がある場合)をコマンドラインで読み取ります
  • 等.

したがって、必要な環境が得られない場合は、開始するソフトウェアにつながるログインのチェーンを把握する必要があります。これは、gdm(X)ログイン->端末エミュレータ-> bashシェル-> su-> bashシェル(ルート)->ソフトウェアのようになります。

ただし、最も正確に推測したい場合は、/etc/environmentは、最近のディストリビューションのすべてのプロセスで読み取る必要があります。

1
Nakedible

Railsプロセス内から環境変数を設定してみてください。$ Rails_ROOT/config/environment.rbに以下のようなものを追加してみてください。

Rails::Initializer.run do |config|
   ENV['LD_LIBRARY_PATH'] = "/usr/local/Oracle_client/v8_1_7/lib"
end

oracleデータベースバインディングのrequireまたはgemステートメントを追加する前に、これが設定されていることを確認する必要があります。

0
kisoku

これを試しましたか:

Sudo su - root -c "LD_LIBRARY_PATH=/usr/local/Oracle/lib <command to start the app>"

環境変数の設定とコマンドの実行の間にセミコロンがないことに注意してください。

0
James Woest

スクリプトに追加する方法はいくつかありますが、ダイナミックリンカーの構成へのパスを直接追加する方が簡単で堅牢なアプローチになると思います。

 $ Sudoエディター/etc/ld.so.conf.d/railslibs

質問で言及したパスをそのファイルに追加し、Sudo ldconfigを実行します。

それは環境の変更を不要にするはずです。

0
Insyte

これには、上記のInsyteが提案する方法を含め、いくつかの方法があります。

ただし、/ etc/ld.so.confに属していない環境変数を設定する必要がある場合は、単に/ etc/environmentに配置することもできます。

0
DictatorBob

これがredhatファミリーのディストリビューションの場合:

echo 'export LD_LIBRARY_PATH=/usr/local/Oracle/lib' > /etc/profile.d/Oracle
0
cagenut