Java アプリケーションを sudo で起動すると、正しく実行できません。私のアプリケーションは、クライアント接続にソケットを使用し、データベース接続も確立します。アプリを正常に起動した場合:
java myApp
すべてが完璧に機能します。ただし、これを Web サイトからバックグラウンドで開始できるようにしようとしています。そこで、exec() または passthru() を使用して起動する PHP を作成しました。最初はこれでうまくいくように見えましたが、すぐにソケットが実際には接続されていないことに気付きました。さらに試行錯誤を重ねた結果、これはjava myApp
root としてログインしているが、PHP が root として実行されていないため、セキュリティ上の問題があるためであるという結論に達しました。
そこで、スクリプトを作成し、パスワードなしでスクリプトを実行できるように SUDOERS を設定しました。スクリプトにはjava myApp
. スクリプトを次のように実行すると:
bash myScript
ソケットが接続されません。(つまり、アプレット クライアントが接続しようとしてハングアップします。)
sudo bash myScript
jdbc MySql ドライバーが見つかりません。これを解決するために、コンパイルや実行時に -classpath を使用したり、jdbc jar のコピーを別の場所に配置したりするなど、クラスパスをいじるなど、さまざまな方法を試しましたが、うまくいきませんでした。どうやら、sudo 環境は、Java が jdbc ドライバーを見つけられない原因となる root としてログインした環境とは微妙な点で異なります。
sudo bash myScript
明確にするために、ルートとしてログインしている ときに実行しようとすると、jdbc ClassPathNotFound (接続の試行方法によっては適切なドライバーエラーがありません) が発生します。bash myScript
rootとしてログインしているすべてのカウントで問題なく動作します。PHP スクリプトからいずれかを実行しようとすると、ソケットまたは jdbc のいずれかである可能性があるクライアント アプレットが接続できません。私はいかなる種類の IDE も使用していません。テキスト エディターで編集し、javac を使用してコンパイルするだけです。
任意の提案をいただければ幸いです。
アップデート:
それが役立つ場合、サーバーはCentOSを実行しています。-E は環境の問題だと思いました(環境の損失が原因だと推測していましたが、見つけたsudoのドキュメントは解決策を見つけるのに役立ちませんでした)。試してみpassthru('sudo -i bash /path/to/myScript.sh');
ましたが、Java アプリはまだ起動できません。パススルーからブラウザに何も表示されません。スクリプトは次のようになります。
cd /path/to/app
java myApp
まだ自分でいじっています。私はこの仕事をするのに近づいていることを知っています。