建網(wǎng)站的重要性網(wǎng)絡(luò)營銷服務(wù)的內(nèi)容
閑來無事用py寫了一個啟動Redis和Nacos的小程序,這里記錄一下!
(有需要的復(fù)制之后修改成自己的路徑)
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的函數(shù)
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狀態(tài)", "Redis 已在運(yùn)行 (6379端口已被占用)")returntry:# 異步啟動RedisPopen([redis_path, redis_conf])messagebox.showinfo("Redis狀態(tài)", "Redis啟動命令已發(fā)送,請檢查Redis是否已啟動。")except Exception as e:messagebox.showerror("錯誤", f"啟動Redis失敗: {str(e)}")# 啟動Nacos的函數(shù)
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狀態(tài)", "Nacos 已在運(yùn)行 (8848端口已被占用)")returntry:# 異步啟動NacosPopen([nacos_path, '-m', 'standalone'])messagebox.showinfo("Nacos狀態(tài)", "Nacos 啟動命令已發(fā)送,請檢查Nacos是否已啟動。")except Exception as e:messagebox.showerror("錯誤", f"啟動Nacos失敗: {str(e)}")# 關(guān)閉Redis的函數(shù)
def stop_redis():pid = find_pid_by_port(6379)if pid:message = kill_process(pid)messagebox.showinfo("關(guān)閉Redis", message)else:messagebox.showinfo("關(guān)閉Redis", "Redis 未運(yùn)行 (6379端口未被占用)")# 關(guān)閉Nacos的函數(shù)
def stop_nacos():pid = find_pid_by_port(8848)if pid:message = kill_process(pid)messagebox.showinfo("關(guān)閉Nacos", message)else:messagebox.showinfo("關(guān)閉Nacos", "Nacos 未運(yùn)行 (8848端口未被占用)")# 查找指定端口占用的進(jìn)程ID
def find_pid_by_port(port):"""通過端口號查找對應(yīng)的進(jìn)程ID(PID):param port: 要查找的端口號:return: 端口對應(yīng)的進(jìn)程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的進(jìn)程
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"進(jìn)程ID為 {pid} 的進(jìn)程已成功被殺死。"else:return f"無法殺死進(jìn)程ID為 {pid} 的進(jìn)程: {result.stderr}"# 按鈕點擊事件處理函數(shù)
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("進(jìn)程操作結(jié)果", message)else:messagebox.showinfo("未找到進(jìn)程", f"沒有找到監(jiān)聽在端口 {port} 上的進(jìn)程。")except ValueError:messagebox.showerror("輸入錯誤", "請輸入有效的端口號(整數(shù))。")# 更新服務(wù)狀態(tài)顯示
def update_service_status():while True:# 獲取當(dāng)前狀態(tài)nacos_status = "運(yùn)行中" if is_port_in_use(8848) else "未運(yùn)行"redis_status = "運(yùn)行中" if is_port_in_use(6379) else "未運(yùn)行"# 更新顯示status_text = f"Redis狀態(tài): {redis_status}\nNacos狀態(tài): {nacos_status}"status_label.config(text=status_text)# 根據(jù)狀態(tài)設(shè)置顏色if redis_status == "運(yùn)行中":status_label_redis.config(text="●", foreground="green")else:status_label_redis.config(text="●", foreground="red")if nacos_status == "運(yùn)行中":status_label_nacos.config(text="●", foreground="green")else:status_label_nacos.config(text="●", foreground="red")# 每隔2秒更新一次time.sleep(2)# 主函數(shù)
def main():global status_label, status_label_nacos, status_label_redisroot = tk.Tk()root.title("服務(wù)啟動器")# 默認(rèn)路徑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="殺死進(jìn)程", command=on_button_click).pack(side=tk.RIGHT)# 服務(wù)狀態(tài)顯示部分status_frame = ttk.LabelFrame(main_frame, text="服務(wù)狀態(tài)", padding="10 10 10 10")status_frame.pack(fill=tk.X, pady=10)# 狀態(tài)顯示標(biāo)簽status_label = ttk.Label(status_frame, text="Redis狀態(tài): 檢測中...\nNacos狀態(tài): 檢測中...")status_label.pack(side=tk.LEFT, padx=10)# 狀態(tài)指示燈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="關(guān)閉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="關(guān)閉Nacos", command=stop_nacos).pack(side=tk.LEFT, padx=5)# 嘗試設(shè)置ttk主題style = ttk.Style()try:style.theme_use('clam')except tk.TclError:print("主題clam不可用,使用默認(rèn)主題。")# 啟動狀態(tài)更新線程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
還有個缺點,運(yùn)行之后會生成derby.log和一個word文件,不知道怎么去除,有能力的改一下(改代碼,別改軟件的配置)!