我使用Linux(LMDE),我想知道如何制作简单的.py脚本来启动和停止另一个python应用程序。例如:
if pyApp is running :
kill pyApp
exit xterminal
else :
start xterminal
python pyApp.py
适用于python还是应该使用bash?
答案 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。大多数系统还具有pgrep
或pidof
命令,您可以通过这些命令查找具有特定名称的进程的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.kill
和os.spawn
的变体在Python中完全可行。