如何使用python脚本启动/终止应用程序?

时间:2013-07-23 11:50:38

标签: python linux debian

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

if pyApp is running :
   kill pyApp
   exit xterminal

else :
   start xterminal
   python pyApp.py

适用于python还是应该使用bash?

2 个答案:

答案 0 :(得分:9)

与实现无关的概念(你需要知道的是你选择了Python还是bash或其他东西):

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

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

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

bash详细信息

在bash中,您可以使用$!获取上次启动的流程的流程ID。大多数系统还具有pgreppidof命令,您可以通过这些命令查找具有特定名称的进程的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(...)生成任何可执行文件。然后,您可以以编程方式控制子进程(将数据发送到stdin,终止进程,检索其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中实现基本解决方案。你可能最终会得到更少的代码。在这两种情况下,您都可能犯下严重错误。最后,这是一个品味问题。

答案 1 :(得分:1)

使用os.killos.spawn的变体在Python中完全可行。