写在前面

我们最终的目的是实现远程开启和关闭程序

所有我们需要最少需要一台服务器,和一台客户端,说白了就是两台电脑

而且客户端和服务器是能够进行数据交互的

代码实现是用的python,不过也会详细的讲一些思路,在其他语言也是可以通用的,或者也可以用更好的方式改进它

如果你仅仅是看思路是可以的

如果你使用python去实现的话,你最好对python和flask有一些了解

需求

  1. 每次登陆服务器开启程序,不是很友好,能不能实现远程开启程序
  2. 服务器程序一多,一个个输入命令开启和关闭,比较麻烦,能不能实现一键开启关闭
  3. 如果程序挂掉,或者服务器挂掉,能不能监控或者自动重启程序
    主要矛盾:繁琐而重复的劳动,没有太大价值,我们需要用程序来代替

环境

  • 客户端系统:windows7
  • 服务器系统:windows server 2008
  • 语言:python3.7

思路

第一步

实现服务器上开启程序

实现开启程序,我们不能手动一个个去输入命令开启,这样就没有意义了

我们需要的是通过程序来开启

使用cmd命令来开启程序

不知大家是否知道,MS-DOS中有一个start命令,它可以用来启动一个单独的窗口运行指定的程序或命令。

我们打开cmd,运行下start/?来查看下帮助




python Windows rpc 远程执行命令 python远程启动exe程序_关闭程序


还是蛮多的,我们这里用不到这么多

我们这里使用的是


start cmd /b /k {taskpath}


这里命令的作用就是新建一个cmd窗口,并运行程序

可以把{taskpath}替换成你的文件路径,这里的文件,我们需要的是能直接打开运行的

一般我们执行py程序,比如你有个ceshi.py需要执行,我们可以cmd中输入命令:python ceshi.py,我们想直接的在cmd中输入ceshi.py,程序是不会执行的


# D:\ceshi\ceshi.py

import time 
print("你好")
time.sleep(5)


这个时候,我们可以新建一个bat文件

注意:这个bat后面会用到

比如我们新建一个ceshi.bat文件,写入


D:
cd D:\ceshi
python ceshi.py


这样我们直接cmd输入命令:


start cmd /b /k D:\ceshi\ceshi.bat


就可以自动的新建窗口并运行程序


python Windows rpc 远程执行命令 python远程启动exe程序_关闭程序_02


这样我们就实现了在单个服务器上用命令来开启程序

注意

使用命令运行ceshi.py的方式,并不是只有这一种,

或者你可以这样


start cmd /b /k "python D:\ceshi\ceshi.py"


当然,如果你可以更好的方式,欢迎交流~

使用py脚本来开启程序

一直使用使用dos命令来运行程序的话,后面的步骤实现,就比较艰难,这里我们改用python

python中有个os模块

OS模块是什么呢?

简单的来说它是一个Python的系统编程的操作模块

我们可以使用os.system(cmd) 来直接操作cmd命令

就像这样


cmd = "start cmd /b /k "python D:\ceshi\ceshi.py"
r = os.system(cmd)


是不是很简单

那么现在我们能过通过实现py脚本来开启程序

接下来看看如何关闭程序,这个和开启程序的方式逻辑上几乎是相同的,下面就简单的说一下

第二步

实现服务器上关闭程序

使用cmd命令来关闭程序

这里我们使用的是taskkill命令

描述: 使用该工具按照进程 ID (PID) 或映像名称终止任务。

我们cmd输入taskkill /?来查看下帮助信息


python Windows rpc 远程执行命令 python远程启动exe程序_开发语言_03



taskkill /f /t /pid {pid}


这里命令的作用就是根据进程ID,来终止任务

可以把{pid}替换成你的程序进程ID

怎么样获取到程序的进程ID

在python中很简单


os.getpid()


一行代码即可,通过os中的getpid()来获取到程序自己的进程ID

我们在交互式命令行中试下


python Windows rpc 远程执行命令 python远程启动exe程序_服务器_04


这里7712就是程序的进程ID

使用py脚本来关闭程序

这里和上面几乎一样

同样使用os.system(cmd)命令


cmd = "taskkill /f /t /pid 7712"
r = os.system(cmd)


最后一步

实现远程控制

客户端控制服务器上的测试程序开启或者关闭

我这里是思路是

  1. 先实现一个flask接口,放在服务器上
  2. 客户端发送开启或者关闭的请求给接口
  3. 接口来控制测试程序的开启和关闭

思路是并不是很复杂

放个大致的流程图


python Windows rpc 远程执行命令 python远程启动exe程序_服务器_05


可以看到,我把pid和bat路径存到了数据库,当然你也可以使用其他的方式存储

放下代码

接口程序.py


#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File    :   server_service.py
@Time    :   2021/02/02 16:16:22
@Author  :   吉祥鸟
@GitHub  :   https://github.com/jixn-hu
'''
from flask import Flask,request
import os

app = Flask(__name__)

@app.route("/start/task",methods=["POST"])
def start_task():
    "开启task"
    taskpath = request.form["taskpath"]
    cmd = f"start cmd /b /k {taskpath}"
    r = os.system(cmd)
    return str(r)

@app.route("/close/pid/<int:pid>",methods=["GET"])
def close_pid(pid):
    "根据pid 杀死进程"
    cmd = f"taskkill /f /t /pid {pid}"
    r = os.system(cmd)
    return str(r)

if __name__ == "__main__":
    app.run(debug=True,host="0.0.0.0",port="9999")


到这里,思路都说完了~

写在最后

我们直接发送请求,其实并不是很方便,我这里实现了一个的简单前端页面

我们只需要访问网页,在网页上实现远程开启很关闭程序


python Windows rpc 远程执行命令 python远程启动exe程序_python_06


前端不是很熟,所以界面比较简单,凑合着看,哈哈哈!