【问题标题】:Python subprocess behaves differently across distributionsPython 子进程在不同的发行版中表现不同
【发布时间】: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 指向您想要的位置。

标签: python ubuntu popen


【解决方案1】:

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

【讨论】:

  • 谢谢;你对 TOMCAT_CMD 是正确的,那就是 java + args。 /usr/bin/java 是 /etc/alternatives/java 的符号链接,它符号链接到 openjdk-7-jre。看起来很正常...我实际上已经修复了它...不同之处在于 openSUSE 使用 bash 作为默认值,而 Ubuntu 使用 sh。所以在 subprocess.Popen 上我添加了 'executable=/bin/bash',它的行为方式与在 openSUSE 中相同。这似乎就是区别。感谢您的回复,间接地让我找到了答案。
猜你喜欢
  • 1970-01-01
  • 2020-09-17
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
相关资源
最近更新 更多