如果打开另一个终端窗口,则无法终止/终止程序

如果打开另一个终端窗口,则无法终止/终止程序

我正在树莓派上运行一个程序,它会在一定时间内打开其他几个Python程序,然后关闭它们。怎么了:

  • 如果我从 Python 3 IDE 或 Thonny Python 或其他 IDE 运行主程序,一切正常,它会按预期打开和关闭所有程序。
  • 如果我从Python 3 IDE或Thonny Python或其他IDE运行主程序,但我打开了一些其他终端窗口(甚至没有运行任何东西,只是打开并闲置),它将打开所有程序,但它是之后无法关闭它们。
  • 如果我在终端窗口中运行主程序,它将打开所有程序,但之后无法关闭它们。

代码例如

while True:
    proc = subprocess.Popen(['lxterminal', '-e', ' test_aa.py'])
    proc_bb = subprocess.Popen(['lxterminal', '-e', 'test_bb.py'])
    time.sleep(5)
    proc.terminate()
    proc_bb.kill()
    time.sleep(200)

另一个例子

while True:
    print("opening")
    proc = subprocess.Popen(['lxterminal', '-e', ' test_aa.py'])
    c = proc.pid 
    print(c)
    time.sleep(3)
    os.kill(c, signal.SIGTERM)
    time.sleep(700)

如果没有手动打开其他终端窗口,则可以工作,

为了启动程序,我还尝试了 Popen 和 os.system 的不同变体,它们每次都运行良好。

要终止/终止我尝试过: os.system、os.kill(pid, signal.SIGTERM)、os.kill(pid, signal.SIGINT) 等。用 -9 PID、subprocess.Popen 终止,然后终止()或终止()

更新1

根据我上面的问题,我想我可以部分回答它,但同时这会引发更多问题。

考虑这段代码:

while True:
    print("opening")
    proc = subprocess.Popen(['lxterminal', '-e', ' test_aa.py'])
    c = proc.pid 
    print(c)
    time.sleep(3)
    os.kill(c, signal.SIGTERM)
    time.sleep(700)

使用

  ps aux 

我找到

   ['lxterminal'] 

   ['test_aa.py']

正在以不同的 pid 编号运行。所以

    c = proc.pid 

给我 ['test_aa.py'] 的 pid,这可能可以解释为什么我无法终止 ['lxterminal']

我这样说对吗?

在另一个终端窗口中启动 python 程序但要确保它们具有相同的 pid 号的其他选项是什么?

更新2

我正在一个 pid 号下运行新的终端窗口 - 所以这是排序的。我还使用代码来确保没有僵尸进程正在运行:

stdout, stderr = proc.communicate()
proc.wait()

它确实有效,没有僵尸进程在运行。

但不幸的是,同样的故事又发生了,如果我打开某个终端窗口并运行我的程序,它不会终止由我的程序启动的终端。我尝试了两个不同的树莓派。一样。

为什么如果我打开另一个终端窗口,它突然无法关闭我的程序?

最终更新

我部分回答了我自己的问题

我仍然不明白为什么如果我打开了一些终端窗口,我的程序不会终止其他程序,但我找到了解决方法。代替

 lxterminal, 

我在用

 uxterm #uterm can also be used 

我的代码现在看起来像这样:

proc = subprocess.Popen([‘uxterm’, ‘-e’, ‘test_aa.py’], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, preexec_fn=os.setsid) 

它工作完美。我可以在终端窗口中运行其他程序,我可以重新启动并使用 .sh 文件使所有程序再次恢复活力。

这正是我一直在寻找的:-)

谢谢大家的帮助。

相关内容