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