2

私は 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 スクリプトを使用すると、運用環境で失敗します。どういうわけかローカルアプリにアクセスできません。繰り返しますが、私の開発環境ではすべて正常に動作します。これは私の観察に関連していますか?

4

1 に答える 1

2

getpass.getuser()'LOGNAME', 'USER', 'LNAME', 'USERNAME'他のことを試す前に、最初に環境変数を(この順序で)調べます。おそらく、そのうちの1つが正しく設定されていません。

os.getuid()またはpwd.getpwuid(os.getuid())- を使用してみてください。別の結果が得られるはずです。

プロセスが何らかの形でルート権限を取得した可能性は非常に低いと思います。

于 2013-04-10T12:27:21.640 に答える