Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python脚本启动/终止应用程序?_Python_Linux_Debian - Fatal编程技术网

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

如何使用python脚本启动/终止应用程序?,python,linux,debian,Python,Linux,Debian,我使用Linux(LMDE),我想知道如何使用simple.py脚本来启动和停止另一个python应用程序。例如: if pyApp is running : kill pyApp exit xterminal else : start xterminal python pyApp.py 它适合python还是应该使用bash?这在python中使用os.kill和os.spawn的变体是完全可行的 独立于实现的概念(无论您选择的是Python还是bash还是其他东西

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

if pyApp is running :
   kill pyApp
   exit xterminal

else :
   start xterminal
   python pyApp.py

它适合python还是应该使用bash?

这在python中使用
os.kill
os.spawn
的变体是完全可行的

独立于实现的概念(无论您选择的是Python还是bash还是其他东西,您都需要知道):

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

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

如果pyApp正在运行,则您的
行需要了解要监视并最终终止的应用程序的进程ID(PID)。仅通过名称识别PID可以工作,但不可靠(可能有多个进程具有相同的名称)。为了在进程ID和您感兴趣的应用程序之间建立可靠的对应关系,监控“脚本”应该是首先启动应用程序的脚本。它应该是完全管理应用程序的程序。一个好的参考是

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.
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
Python详细信息

在Python中,我建议使用
子流程
模块。您可以通过
p=subprocess.Popen(…)
生成任何可执行文件。然后,您可以以编程方式控制子流程(将数据发送到stdin,终止流程,检索其PID供以后使用,获取其退出代码,…)

同样,一个简单但可靠的工作示例是:

app & # Start a new process with your app in the background.
APP_PID=$! # Remember its PID.
kill $APP_PID # Send SIGTER to process.
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中实现一个基本解决方案。您可能会得到更少的代码。在这两种情况下,你都可能犯严重的错误。最后,这是一个品味问题。

可以直接在shell脚本中使用相应的命令,而不是在Python中使用这些基本的OS命令。如果你想使用Python,你应该使用它的
子流程
模块来完成这些任务。我感谢你花时间如此广泛地澄清这件事。bash是否可以接受if,else…?您的意思是bash是否支持条件语句?当然,看起来您必须完成一个非常基本的bash教程…:-)。