Python检查另一个脚本是否正在运行并停止它

时间:2015-02-20 01:45:09

标签: python ubuntu-14.04

我有几个python脚本可以打开和关闭电视。有时电视没有第一次响应所以我使用while循环继续发送命令,直到发送“成功”响应。最多10次。

我需要检查其中一个程序是否在其中任何程序启动时运行并终止第一个进程。

这个答案使用域锁,我认为这可行,但我真的不明白那里发生了什么: https://stackoverflow.com/a/7758075/2005444

我不知道process_name会是什么。脚本是标题tvon.py,tvoff.py和tvtoggle.py。这只是标题吗?它会包括扩展吗?我如何获得pid以便我可以杀死这个过程?

这是在Ubuntu 14.04.1上运行

编辑:我真正需要的是首先搜索任何这些正在运行的脚本。而且,我可以等待它完成,而不是杀死过程。如果这些进程都没有运行,我可以做一个循环并打破它。

我需要这样做的原因是如果电视关闭并且关闭脚本运行它将永远不会成功。如果它已经关闭,电视将不会响应。这就是为什么我建立了10个命令的限制。它永远不会超过4,所以10是矫枉过正。问题是如果关闭命令试图运行并且我使用tvon脚本打开电视,电视将打开和关闭。虽然电视限制了命令被接受的频率,这减少了发生这种情况的可能性,但我仍然希望尽可能干净地工作。

编辑: 我发现我无法终止进程,因为它可以锁定tty端口,这需要手动重启。所以我认为更聪明的方法是让第二个进程等到第一个进程完成。或者找到一种方法告诉第一个进程在循环中的特定点停止,这样我就知道它没有传输。

2 个答案:

答案 0 :(得分:1)

如果您有插座,请使用它。插座提供全面的双向通信。如果它在套接字上收到任何内容,只需编写你的脚本来自杀。这可以通过创建一个单独的线程来轻松完成,该线程尝试执行socket.recv()(针对SOCK_DGRAM)或socket.accept()(针对SOCK_STREAM / SOCK_SEQPACKET),然后在成功后调用sys.exit()

然后,您可以使用第二个脚本实例中的socket.send()SOCK_DGRAM)或socket.connect()SOCK_STREAM / SOCK_SEQPACKET)来请求第一个实例退出

答案 1 :(得分:1)

此函数可以在* nix系统上按名称终止python脚本。它查看正在运行的进程列表,查找与您的脚本关联的PID,并发出kill命令。

import subprocess
def killScript(scriptName):
        # get running processes with the ps aux command
        res = subprocess.check_output(["ps","aux"], stderr=subprocess.STDOUT)

        for line in res.split("\n"):
                # if one of the lines lists our process
                if line.find(scriptName) != -1:
                        info = []

                        # split the information into info[]
                        for part in line.split(" "):
                                if part.strip() != "":
                                        info.append(part)

                        # the PID is in the second slot
                        PID = info[1]

                        #kill the PID
                        subprocess.check_output(["kill",PID], stderr=subprocess.STDOUT)

在你的电视剧本开头你可以运行类似:

killList = ["tvon.py", "tvoff.py", "tvtoggle.py"]
for script in killList:
        killScript(script)