我正在使用 Runtime.getRuntime().exec(...) 从 Tomcat webapp 中执行 python 脚本。当我在我的开发环境中时一切都很好(Eclipse 通过 Sysdeo-Plugin 运行我的本地 Tomcat(位于 /home/me/opt/tomcat))。当我在生产环境(= Debian Squeeze)中运行我的 web 应用程序时会出现此问题。
我正在使用官方 debian 软件包中的 tomcat6。它通过 /etc/init.d 使用用户“tomcat6”自动启动(通过“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 脚本的分叉执行以“root”身份运行?拥有tomcat6进程(=运行JVM)的用户不应该是同一个用户吗?我是否遗漏了什么,或者获取进程用户的 python 调用不正确?
我也尝试过使用Apache Commons Exec获得相同的结果。
结果是,当我使用调用本地应用程序(/usr/local/bin/local-app)的更复杂的 python 脚本时,它在生产环境中失败。它以某种方式无法访问本地应用程序。同样,在我的开发环境中一切正常。这与我的观察有关吗?