4

我使用 Linux (LMDE),我想知道如何制作简单的 .py 脚本来启动和停止另一个 python 应用程序。例如 :

if pyApp is running :
   kill pyApp
   exit xterminal

else :
   start xterminal
   python pyApp.py

它适合python还是我应该使用bash?

4

2 回答 2

11

独立于实现的概念(无论您选择 Python 还是 bash 或其他东西,您都需要知道的事情):

为了可靠地“杀死”另一个进程,您需要知道它的进程 ID,然后向它发送一个信号(例如 SIGTER)。它取决于其他进程如何处理 SIGTER(它可以忽略它,但它也可以调用关闭代码并正确终止)。信号 SIGKILL 以硬方式杀死另一个进程,它没有任何机会干净地关闭。

为了从给定的可执行文件启动另一个进程,您需要知道此可执行文件的路径,或者此可执行文件必须是有效命令(可以通过PATH环境变量进行控制)。

您的if pyApp is running行需要了解您要监视并最终终止的应用程序的进程 ID (PID)。仅通过名称识别 PID 是可行的,但并不可靠(可能有多个同名进程)。为了在进程 ID 和您感兴趣的应用程序之间建立可靠的对应关系,监控“脚本”应该是首先启动应用程序的脚本。它应该是完全管理应用程序的程序。一个很好的参考是http://mywiki.wooledge.org/ProcessManagement

重击细节

在 bash 中,您可以使用$!. 大多数系统还具有可用的pgreporpidof命令,您可以通过这些命令找到具有特定名称的进程的 ID。

一个简单的成语是:

app & # Start a new process with your app in the background.
APP_PID=$! # Remember its PID.
kill $APP_PID # Send SIGTER to process.

Python 详细信息

在 Python 中,我建议使用该subprocess模块。您可以通过p = subprocess.Popen(...). 然后,您可以以编程方式控制子进程(将数据发送到标准输入,终止进程,检索其 PID 以供以后使用,获取其退出代码,...)。

同样,一个简单但可靠的示例是:

import subprocess

p = subprocess.Popen(["tail", "-f", "~/.bashrc"])
print "Process ID of subprocess %s" % p.pid
# Send SIGTER (on Linux)
p.terminate()
# Wait for process to terminate
returncode = p.wait()
print "Returncode of subprocess: %s" % returncode

如果您需要保持简单并且无论如何都在使用 Linux,我将首先开始在 bash 中实现一个基本解决方案。你最终可能会得到更少的代码。在这两种情况下,你都可能犯严重的错误。最后,这是一个品味问题。

于 2013-07-23T12:03:43.180 回答
1

这在 Python 中使用os.killos.spawn.

于 2013-07-23T11:59:23.360 回答