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?
独立于实现的概念(您需要知道的是您选择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.
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中开始实现基本解决方案.你可能最终会得到更少的代码.在这两种情况下,您都可能犯下严重错误.最后,这是一个品味问题.