【问题标题】:Python subprocess.popen wrong pidPython subprocess.popen 错误的 pid
【发布时间】:2014-11-12 22:33:21
【问题描述】:

我正在尝试用 Python 编写一个监控游戏服务器的程序。 为此,我需要查找在屏幕会话中启动的游戏服务器的进程是否仍在运行,为此,我需要它的 pid,但是,我没有得到屏幕会话的 pid,我获取一个仅在 popen 会话处于活动状态之前存在的 pid。屏幕会话的 pid 比 pid popen 的 .pid() 方法返回的 pid 高一个。我知道这可能是由 shell=True 引起的,但我使用 shell=False 运行它。有什么干净的方法可以在屏幕进程中获取屏幕进程/游戏服务器的 pid?我唯一的其他解决方案就是编写 .pid()+1,但我想这将是一个可怕的解决方法。

这是我的代码的相关部分:

proc = Popen(["screen", "-dmS", self.name, "./srcds_run", "-port", str(self.port), "-game", self.modDir], shell=False)

提前致谢。

【问题讨论】:

    标签: python linux subprocess pid gnu-screen


    【解决方案1】:

    您的问题不在于 python,而在于屏幕。

    当您使用 -dmS 启动屏幕并进入后台时,它会自行进行一些分叉和执行,因此,如果您使用 strace 检查系统调用,您将看到屏幕二进制文件是如何执行的您可以看到返回的 PID,它稍后会执行其他进程并完成。

    这是您在ps 调用中看到的另一个过程

    【讨论】:

    • 有什么解决方案可以以干净的方式获取 pid?还是可以只取 .pid()+1?
    • 似乎没有一种干净的方式来获取它,但是,我会假设 screen 以这种方式是确定性的,所以如果最终过程是+1,那么你可以数它会是+ 1 99% 的情况下,如果周围有其他进程,可能会出现与该数字相关的竞争条件。
    • 好的,谢谢 :) 会这样做,或者用 screen -ls 获取 pid
    猜你喜欢
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    相关资源
    最近更新 更多