写在前面
我们最终的目的是实现远程开启和关闭程序
所有我们需要最少需要一台服务器,和一台客户端,说白了就是两台电脑
而且客户端和服务器是能够进行数据交互的
代码实现是用的python,不过也会详细的讲一些思路,在其他语言也是可以通用的,或者也可以用更好的方式改进它
如果你仅仅是看思路是可以的
如果你使用python去实现的话,你最好对python和flask有一些了解
需求
- 每次登陆服务器开启程序,不是很友好,能不能实现远程开启程序
- 服务器程序一多,一个个输入命令开启和关闭,比较麻烦,能不能实现一键开启关闭
- 如果程序挂掉,或者服务器挂掉,能不能监控或者自动重启程序
主要矛盾:繁琐而重复的劳动,没有太大价值,我们需要用程序来代替
环境
- 客户端系统:windows7
- 服务器系统:windows server 2008
- 语言:python3.7
思路
第一步
实现服务器上开启程序
实现开启程序,我们不能手动一个个去输入命令开启,这样就没有意义了
我们需要的是通过程序来开启
使用cmd命令来开启程序
不知大家是否知道,MS-DOS
中有一个start
命令,它可以用来启动一个单独的窗口运行指定的程序或命令。
我们打开cmd,运行下start/?
来查看下帮助
还是蛮多的,我们这里用不到这么多
我们这里使用的是
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
就可以自动的新建窗口并运行程序
这样我们就实现了在单个服务器上用命令来开启程序
注意
使用命令运行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 /?
来查看下帮助信息
taskkill /f /t /pid {pid}
这里命令的作用就是根据进程ID,来终止任务
可以把{pid}替换成你的程序进程ID
怎么样获取到程序的进程ID
在python中很简单
os.getpid()
一行代码即可,通过os中的getpid()来获取到程序自己的进程ID
我们在交互式命令行中试下
这里7712就是程序的进程ID
使用py脚本来关闭程序
这里和上面几乎一样
同样使用os.system(cmd)命令
cmd = "taskkill /f /t /pid 7712"
r = os.system(cmd)
最后一步
实现远程控制
客户端控制服务器上的测试程序开启或者关闭
我这里是思路是
- 先实现一个flask接口,放在服务器上
- 客户端发送开启或者关闭的请求给接口
- 接口来控制测试程序的开启和关闭
思路是并不是很复杂
放个大致的流程图
可以看到,我把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")
到这里,思路都说完了~
写在最后
我们直接发送请求,其实并不是很方便,我这里实现了一个的简单前端页面
我们只需要访问网页,在网页上实现远程开启很关闭程序
前端不是很熟,所以界面比较简单,凑合着看,哈哈哈!