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

Ale*_*lex 2 python linux debian

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

if pyApp is running :
   kill pyApp
   exit xterminal

else :
   start xterminal
   python pyApp.py
Run Code Online (Sandbox Code Playgroud)

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

Jan*_*cke 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.
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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