建网站淄博天津百度推广电话号码
闲来无事用py写了一个启动Redis和Nacos的小程序,这里记录一下!
(有需要的复制之后修改成自己的路径)
import subprocess
import tkinter as tk
from tkinter import ttk, messagebox
from subprocess import Popen, run, PIPE
import threading
import time# 检查端口是否被占用
def is_port_in_use(port):pid = find_pid_by_port(port)return pid is not None# 启动Redis的函数
def start_redis():redis_path = redis_entry.get()redis_conf = redis_conf_entry.get()if not redis_path or not redis_conf:messagebox.showerror("错误", "请输入Redis路径和配置文件路径")return# 检查6379端口是否已被占用if is_port_in_use(6379):messagebox.showinfo("Redis状态", "Redis 已在运行 (6379端口已被占用)")returntry:# 异步启动RedisPopen([redis_path, redis_conf])messagebox.showinfo("Redis状态", "Redis启动命令已发送,请检查Redis是否已启动。")except Exception as e:messagebox.showerror("错误", f"启动Redis失败: {str(e)}")# 启动Nacos的函数
def start_nacos():nacos_path = nacos_entry.get()if not nacos_path:messagebox.showerror("错误", "请输入Nacos启动路径")return# 检查8848端口是否已被占用if is_port_in_use(8848):messagebox.showinfo("Nacos状态", "Nacos 已在运行 (8848端口已被占用)")returntry:# 异步启动NacosPopen([nacos_path, '-m', 'standalone'])messagebox.showinfo("Nacos状态", "Nacos 启动命令已发送,请检查Nacos是否已启动。")except Exception as e:messagebox.showerror("错误", f"启动Nacos失败: {str(e)}")# 关闭Redis的函数
def stop_redis():pid = find_pid_by_port(6379)if pid:message = kill_process(pid)messagebox.showinfo("关闭Redis", message)else:messagebox.showinfo("关闭Redis", "Redis 未运行 (6379端口未被占用)")# 关闭Nacos的函数
def stop_nacos():pid = find_pid_by_port(8848)if pid:message = kill_process(pid)messagebox.showinfo("关闭Nacos", message)else:messagebox.showinfo("关闭Nacos", "Nacos 未运行 (8848端口未被占用)")# 查找指定端口占用的进程ID
def find_pid_by_port(port):"""通过端口号查找对应的进程ID(PID):param port: 要查找的端口号:return: 端口对应的进程ID,如果找不到则返回None"""command = f"netstat -ano | findstr :{port}"result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)if result.returncode != 0:return Nonefor line in result.stdout.split('\n'):parts = line.split()pid_part = parts[-1] if parts else ''if pid_part.isdigit() and int(pid_part) > 0:return int(pid_part)return None# 杀死指定PID的进程
def kill_process(pid):command = f"taskkill /F /PID {pid}"result = run(command, shell=True, stdout=PIPE, stderr=PIPE, text=True)if result.returncode == 0:return f"进程ID为 {pid} 的进程已成功被杀死。"else:return f"无法杀死进程ID为 {pid} 的进程: {result.stderr}"# 按钮点击事件处理函数
def on_button_click():port_input = port_entry.get()try:port = int(port_input)pid = find_pid_by_port(port)if pid:message = kill_process(pid)messagebox.showinfo("进程操作结果", message)else:messagebox.showinfo("未找到进程", f"没有找到监听在端口 {port} 上的进程。")except ValueError:messagebox.showerror("输入错误", "请输入有效的端口号(整数)。")# 更新服务状态显示
def update_service_status():while True:# 获取当前状态nacos_status = "运行中" if is_port_in_use(8848) else "未运行"redis_status = "运行中" if is_port_in_use(6379) else "未运行"# 更新显示status_text = f"Redis状态: {redis_status}\nNacos状态: {nacos_status}"status_label.config(text=status_text)# 根据状态设置颜色if redis_status == "运行中":status_label_redis.config(text="●", foreground="green")else:status_label_redis.config(text="●", foreground="red")if nacos_status == "运行中":status_label_nacos.config(text="●", foreground="green")else:status_label_nacos.config(text="●", foreground="red")# 每隔2秒更新一次time.sleep(2)# 主函数
def main():global status_label, status_label_nacos, status_label_redisroot = tk.Tk()root.title("服务启动器")# 默认路径DEFAULT_REDIS_PATH = r'D:\environment\redis\Redis-x64-5.0.14.1\redis-server.exe'DEFAULT_REDIS_CONF = r'D:\environment\redis\Redis-x64-5.0.14.1\redis.windows.conf'DEFAULT_NACOS_PATH = r'D:\environment\code-software\nacos-server-1.4.1\nacos\bin\startup.cmd'# 主框架main_frame = ttk.Frame(root, padding="20 20 20 20")main_frame.pack(fill=tk.BOTH, expand=True)# 端口操作部分port_frame = ttk.LabelFrame(main_frame, text="端口操作", padding="10 10 10 10")port_frame.pack(fill=tk.X, pady=10)ttk.Label(port_frame, text="请输入端口号:").pack(side=tk.LEFT)global port_entryport_entry = ttk.Entry(port_frame)port_entry.pack(side=tk.LEFT, padx=10, fill=tk.X, expand=True)ttk.Button(port_frame, text="杀死进程", command=on_button_click).pack(side=tk.RIGHT)# 服务状态显示部分status_frame = ttk.LabelFrame(main_frame, text="服务状态", padding="10 10 10 10")status_frame.pack(fill=tk.X, pady=10)# 状态显示标签status_label = ttk.Label(status_frame, text="Redis状态: 检测中...\nNacos状态: 检测中...")status_label.pack(side=tk.LEFT, padx=10)# 状态指示灯indicator_frame = ttk.Frame(status_frame)indicator_frame.pack(side=tk.RIGHT, padx=10)ttk.Label(indicator_frame, text="Redis:").pack(side=tk.LEFT, padx=(10, 0))status_label_redis = ttk.Label(indicator_frame, text="●", foreground="gray")status_label_redis.pack(side=tk.LEFT, padx=5)ttk.Label(indicator_frame, text="Nacos:").pack(side=tk.LEFT)status_label_nacos = ttk.Label(indicator_frame, text="●", foreground="gray")status_label_nacos.pack(side=tk.LEFT, padx=5)# Redis路径部分redis_frame = ttk.LabelFrame(main_frame, text="Redis配置", padding="10 10 10 10")redis_frame.pack(fill=tk.X, pady=10)ttk.Label(redis_frame, text="Redis路径:").pack(side=tk.LEFT)global redis_entryredis_entry = ttk.Entry(redis_frame)redis_entry.insert(0, DEFAULT_REDIS_PATH)redis_entry.pack(side=tk.LEFT, padx=10, fill=tk.X, expand=True)ttk.Label(redis_frame, text="配置文件:").pack(side=tk.LEFT)global redis_conf_entryredis_conf_entry = ttk.Entry(redis_frame)redis_conf_entry.insert(0, DEFAULT_REDIS_CONF)redis_conf_entry.pack(side=tk.LEFT, padx=10, fill=tk.X, expand=True)# Redis按钮框架redis_btn_frame = ttk.Frame(redis_frame)redis_btn_frame.pack(side=tk.RIGHT)ttk.Button(redis_btn_frame, text="启动Redis", command=start_redis).pack(side=tk.LEFT, padx=5)ttk.Button(redis_btn_frame, text="关闭Redis", command=stop_redis).pack(side=tk.LEFT, padx=5)# Nacos路径部分nacos_frame = ttk.LabelFrame(main_frame, text="Nacos配置", padding="10 10 10 10")nacos_frame.pack(fill=tk.X, pady=10)ttk.Label(nacos_frame, text="Nacos启动路径:").pack(side=tk.LEFT)global nacos_entrynacos_entry = ttk.Entry(nacos_frame)nacos_entry.insert(0, DEFAULT_NACOS_PATH)nacos_entry.pack(side=tk.LEFT, padx=10, fill=tk.X, expand=True)# Nacos按钮框架nacos_btn_frame = ttk.Frame(nacos_frame)nacos_btn_frame.pack(side=tk.RIGHT)ttk.Button(nacos_btn_frame, text="启动Nacos", command=start_nacos).pack(side=tk.LEFT, padx=5)ttk.Button(nacos_btn_frame, text="关闭Nacos", command=stop_nacos).pack(side=tk.LEFT, padx=5)# 尝试设置ttk主题style = ttk.Style()try:style.theme_use('clam')except tk.TclError:print("主题clam不可用,使用默认主题。")# 启动状态更新线程status_thread = threading.Thread(target=update_service_status, daemon=True)status_thread.start()root.mainloop()if __name__ == "__main__":main()
最后打开cmd到py文件为止,打包成exe
pyinstaller --noconsole -F .\start.py
还有个缺点,运行之后会生成derby.log和一个word文件,不知道怎么去除,有能力的改一下(改代码,别改软件的配置)!