Python子流程在不同的发行版中表现不同

时间:2013-04-27 14:37:12

标签: python ubuntu popen

我编写了一个小的python脚本,作为Apache Tomcat服务的LSB兼容初始化脚本。我在运行openSUSE的工作笔记本电脑上完成了这个脚本和初始测试;实际部署将在Ubuntu Server上进行(请不要开玩笑,我也感到难过)。

虽然脚本在openSUSE(python 2.7.3)下完美运行,但在Ubuntu中它的行为是不同的(也是python 2.7.3)......

当我执行subprocess.Popen调用时,在openSUSE中打开进程然后我将.pid捕获到'control'文件...

在Ubuntu中,同样的脚本,subprocess.Popen调用打开两个进程,一个以'/ usr / bin -c java(...)'开头,然后是另一个'java(...)'。如果写入的PID是来自/ bin / sh ...

的PID,那真的很烦人

这是我第一次使用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))

1 个答案:

答案 0 :(得分:1)

假设TOMCAT_CMD基本上是java -whatever,在大多数平台上/usr/bin/java似乎只是(某些变体)Java,而是在Ubuntu上实现Debian Java策略的一些细节的shell脚本,在exec之前:使用正确的参数输入系统的首选Java二进制文件。对于它的价值,后者通常是一件好事,因为它可以更容易地从一个Java实现切换到另一个Java实现,但如果你只关心一个特定的实现,那么你可以直接链接到该实现& #39;在TOMCAT_CMD中的二进制文件(和/或如果你想要完全符合Debian并且不能使用shell脚本,则重新实现Python中的策略。)