【问题标题】:How to Terminate an infinite while loop in a bash code from another python code?如何从另一个python代码终止bash代码中的无限while循环?
【发布时间】:2023-03-27 07:13:01
【问题描述】:

想象以下无限循环:

#!/bin/bash
i=0
while true; do
   echo $i
   i=$((i+1))
done

我正在从这样的 python 代码运行此代码:

def start(self):
  filepath = '/home/sysop/.seiscomp3/program.sh'
  if os.path.exists(filepath):
     Command = "gnome-terminal -e '/home/alireza/.seiscomp3/program.sh'"
     proc = subprocess.Popen(['bash','-c', Command])
  else:
     print ("The executable file is missing. Check ~/.seiscomp3 directory ...")
def stop(self):
   proc.terminate()

上面的 python 代码与另一个程序(我们称之为 SC3)一起工作,并在新终端中启动/停止上面的 bash 代码。当我运行 SC3 程序时,它应该运行上述 python 代码中的“启动”函数。(工作正常)。但问题在于 stop 函数,它应该杀死在子进程中运行的 bash 代码。 我的问题是如何终止这个新终端及其进程?

【问题讨论】:

  • 我认为问题在于“start”函数中创建的子进程PID无法从“stop”函数访问......有什么想法吗?

标签: python-3.x infinite-loop terminate


【解决方案1】:

您当前正在启动额外的进程,这妨碍了将正确的进程作为 Popen 的返回来捕获。

如果可能,运行

proc = subprocess.Popen(['bash', '/home/alireza/.seiscomp3/program.sh'])

应该更直接,让你捕捉到正确的过程,这将使剩下的答案有用。


鉴于您将 self 传递给 start 和 stop 函数,这让我相信这些是对象上的方法。如果您可以将您在该对象中创建的进程的句柄存储在一个新字段下,那么您可以将其拉回以在停止函数中使用。


def start(self):
    filepath = '/home/sysop/.seiscomp3/program.sh'

    # Just in case the path doesn't exist
    self.proc = None

    if os.path.exists(filepath):
        Command = "gnome-terminal -e '/home/alireza/.seiscomp3/program.sh'"

        # Assign to the internal field proc
        self.proc = subprocess.Popen(['bash','-c', Command])
    else:
        print ("The executable file is missing. Check ~/.seiscomp3 directory ...")

def stop(self):
    # Make sure that the object has the proc field (It should if it has been started.)
    # AND
    # Only try to terminate if there is a process running
    if('proc' in dir(self) and self.proc):
        self.proc.terminate()

如果它们不是方法,您可以从 start 函数返回 proc 并将其传递给 stop 函数。


start():
    # Do stuff
    return proc

stop(proc):
    proc.terminate()

【讨论】:

  • 感谢您的建议,但它给了我这个错误“错误:无法停止:模块实例没有属性'proc'”。
  • 我想知道为什么,但是当我使用命令“PiD = proc.pid”获取子进程 PID 然后尝试在终端“kill -9 $PiD”中手动杀死它时找不到要杀死的 PID!
  • 如您所说,这些是 SC3 软件的一些方法。但是您的建议都不起作用!同样的错误
  • 对不起,我想我看错了问题。您正在做的是开始额外的流程;一个 bash 进程,它启动一个 gnome-terminal 进程,它启动一个运行 bash 脚本的进程。
猜你喜欢
  • 2014-11-09
  • 1970-01-01
  • 2014-01-30
  • 2019-10-13
  • 2020-05-10
  • 1970-01-01
  • 2018-04-20
  • 2021-05-10
  • 1970-01-01
相关资源
最近更新 更多