我使用 Linux (LMDE),我想知道如何制作简单的 .py 脚本来启动和停止另一个 python 应用程序。例如 :
if pyApp is running :
kill pyApp
exit xterminal
else :
start xterminal
python pyApp.py
它适合python还是我应该使用bash?
独立于实现的概念(无论您选择 Python 还是 bash 或其他东西,您都需要知道的事情):
为了可靠地“杀死”另一个进程,您需要知道它的进程 ID,然后向它发送一个信号(例如 SIGTER)。它取决于其他进程如何处理 SIGTER(它可以忽略它,但它也可以调用关闭代码并正确终止)。信号 SIGKILL 以硬方式杀死另一个进程,它没有任何机会干净地关闭。
为了从给定的可执行文件启动另一个进程,您需要知道此可执行文件的路径,或者此可执行文件必须是有效命令(可以通过PATH
环境变量进行控制)。
您的if pyApp is running
行需要了解您要监视并最终终止的应用程序的进程 ID (PID)。仅通过名称识别 PID 是可行的,但并不可靠(可能有多个同名进程)。为了在进程 ID 和您感兴趣的应用程序之间建立可靠的对应关系,监控“脚本”应该是首先启动应用程序的脚本。它应该是完全管理应用程序的程序。一个很好的参考是http://mywiki.wooledge.org/ProcessManagement。
重击细节
在 bash 中,您可以使用$!
. 大多数系统还具有可用的pgrep
orpidof
命令,您可以通过这些命令找到具有特定名称的进程的 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 中实现一个基本解决方案。你最终可能会得到更少的代码。在这两种情况下,你都可能犯严重的错误。最后,这是一个品味问题。
这在 Python 中使用os.kill
和os.spawn
.