【发布时间】:2013-04-27 14:37:12
【问题描述】:
我编写了一个小的 python 脚本来充当 Apache Tomcat 服务的 LSB 兼容初始化脚本。我已经在运行 openSUSE 的工作笔记本电脑上完成了这个脚本和初始测试;实际部署是在 Ubuntu Server 上进行的(请不要开玩笑,我也为此感到难过)。
虽然该脚本在 openSUSE (python 2.7.3) 下完美运行,但在 Ubuntu 中它的行为有所不同(也是 python 2.7.3)...
当我执行 subprocess.Popen 调用时,在 openSUSE 中它会打开进程,然后我将 .pid 捕获到一个“控制”文件...
在 Ubuntu 中,同样的脚本,subprocess.Popen 调用会打开两个进程,一个以'/usr/bin -c java (...)' 开头,然后是另一个'java (...)'。这真的很烦人,写入的 PID 是来自 /bin/sh 的那个...
这是我第一次使用 Ubuntu Server,虽然我已经计划将所有内容迁移到 RHEL(这种废话也不会发生),但我仍然想知道为什么会在 Ubuntu 和躲避它的潜在方法...
启动函数就是这个
def start():
set_user()
with open(CATALINA_OUT, "a") as log:
tomcat = subprocess.Popen(TOMCAT_CMD + 'start', shell=True, stdout=log, stderr=log)
write_pidfile(tomcat.pid)
def set_user():
os.setgid(int(TOMCAT_GID))
os.setuid(int(TOMCAT_UID))
【问题讨论】:
-
不看代码就无法回答。
-
我已经添加了我用来启动的函数和 set_user() 以供参考。 start() 在 openSUSE 和 Ubuntu 中的行为确实不同(openSUSE 12.3 与 Ubuntu 12.04)。
-
您是否在两个操作系统上使用相同版本的 Tomcat?有时,最简单的事情会让我们措手不及……
-
如果你想跳过shell,将
shell=False传递给Popen。这样可以更好地控制启动多少进程。 -
/usr/bin -c java没有意义,你的意思是/bin/sh -c java?那么是的,修复将是shell=False和/或确保TOMCAT_CMD指向您想要的位置。