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

标签 python ubuntu popen

我编写了一个小的 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))

最佳答案

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

关于Python 子进程在不同的发行版中表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16253335/

相关文章:

multithreading - 当管道输出时,Python 子进程挂起为 Popen

c - Popen 导致程序卡住

python - 子进程打开以运行命令(HDFS/hadoop)

python - 如何修剪 .fits 图像并保持世界坐标以便在 astropy Python 中绘图?

Python 将一列拆分为多列并将拆分的列重新附加到原始数据帧中

python - 如何使用正则表达式判断字符串的第一个和最后一个字符是否匹配?

python - 终端在尝试提交 Git 时意外运行了命令

python - 从 Python 检查进程状态

ubuntu - 解决 IBus 问题 - 1.5.11 之前的 IBus 可能会导致输入问题

python - GLib-GIO-Message : Using the 'memory' GSettings backend. 您的设置将不会被保存或与其他应用程序共享