私は Runtime.getRuntime().exec(...) を使用して、Tomcat webapp 内から python スクリプトを実行しています。開発環境 (Sysdeo-Plugin を介してローカルの Tomcat (/home/me/opt/tomcat にある) を実行している Eclipse) にいるときは、すべてうまくいきます。この問題は、実稼働環境 (= Debian Squeeze) で webapp を実行すると発生します。
公式の debian パッケージの tomcat6 を使用しています。これは、ユーザー「tomcat6」を使用して /etc/init.d から自動的に開始されます (「ps aux | grep tomcat6」で検証済み)。私は単純な python スクリプトを実行しています:
Process p = Runtime.getRuntime().exec("python /home/me/exec-test.py")
p.waitFor();
//read the stdout and stderr
Python スクリプトは簡単です。
#!/usr/bin/python
import sys, os, getpass
def main(argv):
print "Working dir: " +os.getcwd()
userShell = os.environ.get('SHELL')
print "$SHELL set to: " +userShell
print "Executing as user: "+getpass.getuser()
if __name__ == "__main__":
main(sys.argv[1:])
Eclipse から Tomcat を実行した場合の出力は次のとおりです。
Working dir: /home/me/opt/tomcat
$SHELL set to: /bin/bash
Executing as user: me
debian パッケージの tomcat6 を使用して実行する場合:
Working dir: /var/lib/tomcat6
$SHELL set to: /bin/bash
Executing as user: root
Python スクリプトの分岐実行が「ルート」として実行されるのはなぜですか? tomcat6 プロセスを所有している (= JVM を実行している) 同じユーザーであるべきではありませんか? 何か不足していますか、それともプロセスのユーザーを取得するための python 呼び出しが正しくありませんか?
Apache Commons Execも使用してみましたが、同じ結果が得られました。
その結果、ローカル アプリケーション (/usr/local/bin/local-app) を呼び出すより複雑な Python スクリプトを使用すると、運用環境で失敗します。どういうわけかローカルアプリにアクセスできません。繰り返しますが、私の開発環境ではすべて正常に動作します。これは私の観察に関連していますか?