由于我的子系统经常自启动占用后台很大,任务管理器还无法直接关闭必须要用命令行,平常还好一到需要用到一些占用大的软件就非常卡,我想到了Python的os库可以去引用system函数来调用shell
import os
os.system('wsl --shutdown kali-linux')
但是这样太麻烦了,好像还不能完全解放劳动力,这样我还需要自己来看子系统是否自启动,此时我想到了psutil库,这个库可以检测进程,再加上无线循环
import os, psutil
while Ture:
for proc in psutil.process_iter():
if proc.name() == "vmmem":
os.system('wsl --shutdown kali-linux')
else:
continue
如此看来确实方便很多,但是作为一个懒人,每次我用完还要去找去运行,即便封装了也感觉还是很不方便,这个时候我想到了python的线程好像是可以实现暂停的,再加上GUI界面是不是就可以实现暂停和继续呢,这里我用tkinter库来实现GUI界面,我还加上了plyer库来显示提示信息
from tkinter import *
import psutil,os,threading
from plyer import notification
class kill_kali_linux(threading.Thread):
def __init__(self, *args, **kwargs):
super(kill_kali_linux, self).__init__(*args, **kwargs)
self.__flag = threading.Event()
self.__flag.set()
self.__running = threading.Event()
self.__running.set()
def run(self,):
while self.__running.is_set():
self.__flag.wait()
for proc in psutil.process_iter():
if proc.name() == "vmmem":
os.system('wsl --shutdown kali-linux')
notification.notify(title = "Python通知",message = "已检测到进程“vmmem”存在自动kill中",timeout = 3)
def pause(self):
self.__flag.clear()
def resume(self):
self.__flag.set()
def stop(self):
self.__flag.set()
self.__running.clear()
if __name__ == "__main__":
a=kill_kali_linux()
a.daemon = True
root = Tk()
root.title("Python检测子系统自启动界面")
var1=StringVar()
zt = True
a.start()
var1.set("目前状态:开启")
def hit_me():
global zt
if zt:
zt = False
a.pause()
var1.set("目前状态:暂停")
else:
zt = True
a.resume()
var1.set("目前状态:开启")
but=Button(root,text = "点击-->切换功能",width = 15,height = 5,command = hit_me)
but.pack(side = LEFT)
lab = Label(root, textvariable = var1, bg = 'green', font = ('Arial', 12), width = 15, height = 5)
lab.pack(side = LEFT)
root.mainloop()
效果图展示:
对于我这种有强迫症的懒人来说,桌面上放着这样一个丑东西,属实碍眼,这个时候我想到QQ 、微信等一些程序有托盘而且右键可以扩展,托盘显然是一个好的选择,这里我用的是pystray库
from PIL import Image
from plyer import notification
from pystray import *
import threading,psutil,os,sys,pystray,time
from pystray import Icon as icon, Menu as menu, MenuItem as item
class kill_kali_linux(threading.Thread):
def __init__(self, *args, **kwargs):
super(kill_kali_linux, self).__init__(*args, **kwargs)
self.__flag = threading.Event()
self.__flag.set()
self.__running = threading.Event()
self.__running.set()
def run(self):
while self.__running.is_set():
self.__flag.wait()
for proc in psutil.process_iter():
if proc.name() == "vmmem":
os.system('wsl --shutdown kali-linux')
# icon.notify("已检测到进程“vmmem”存在自动kill中")
notification.notify(title = "Python通知",message = "已检测到进程“vmmem”存在自动kill中",timeout = 3)
def pause(self):
self.__flag.clear()
def resume(self):
self.__flag.set()
def stop(self):
self.__flag.set()
self.__running.clear()
a = kill_kali_linux()
a.daemon=True
run_start_kali_linux_state = False
run_pause_kali_linux_state = False
run_resume_kali_linux_state = False
run_stop_kali_linux_state = False
start_a_and_b = True
stop_a_and_b = False
resume_a_and_b = False
pause_a_and_b = False
def run_start_kali_linux(icon:pystray.Icon, item, ):
global run_start_kali_linux_state
global stop_a_and_b
global run_resume_kali_linux_state
global pause_a_and_b
global start_a_and_b
start_a_and_b = False
pause_a_and_b = True
stop_a_and_b = True
run_resume_kali_linux_state = True
run_start_kali_linux_state = not item.checked
a.start()
if a.is_alive():
icon.notify("启动脚本\n脚本已启动")
def run_pause_kali_linux(icon:pystray.Icon, item, ):
global run_pause_kali_linux_state
global run_resume_kali_linux_state
global run_start_kali_linux_state
global start_a_and_b
global stop_a_and_b
global resume_a_and_b
start_a_and_b = False
run_start_kali_linux_state = False
resume_a_and_b = True
stop_a_and_b = True
run_pause_kali_linux_state = not item.checked
run_resume_kali_linux_state = False
a.pause()
if a.is_alive():
icon.notify("暂停脚本\n脚本已暂停")
def run_resume_kali_linux(self:pystray.Icon, item, ):
global run_resume_kali_linux_state
global run_start_kali_linux_state
global run_pause_kali_linux_state
global start_a_and_b
global resume_a_and_b
resume_a_and_b = False
start_a_and_b = False
run_pause_kali_linux_state = False
run_resume_kali_linux_state = not item.checked
run_start_kali_linux_state = True
a.resume()
if a.is_alive():
self.notify("开启脚本\n脚本已开启")
def run_stop_kali_linux(icon:pystray.Icon, item, ):
global run_stop_kali_linux_state
global run_start_kali_linux_state
global run_resume_kali_linux_state
global run_pause_kali_linux_state
global stop_a_and_b
global pause_a_and_b
global start_a_and_b
global resume_a_and_b
resume_a_and_b = False
start_a_and_b = False
pause_a_and_b = False
stop_a_and_b = False
run_pause_kali_linux_state = False
run_resume_kali_linux_state = False
run_start_kali_linux_state = False
run_stop_kali_linux_state = not item.checked
a.stop()
if not a.is_alive():
icon.notify("关闭脚本\n脚本关闭意味着线程关闭,请重启后开启脚本")
# a = kill_kali_linux()
# a.daemon = True
def restart(icon:pystray.Icon, item, ):
icon.notify("重启脚本\n脚本已重启")
time.sleep(0.5)
python = sys.executable
os.execl(python, python, *sys.argv)
def on_exit(icon:pystray.Icon, item):
icon.notify("关闭脚本\n脚本已关闭")
time.sleep(0.5)
icon.stop()
image = Image.open("1.jpg")
icon('test', image, menu = menu(
item('功能列表',
menu(
MenuItem(text = '启动脚本', action = run_start_kali_linux, checked = lambda item: run_start_kali_linux_state, enabled = lambda item:start_a_and_b),
MenuItem(text = '暂停脚本', action = run_pause_kali_linux, checked = lambda item: run_pause_kali_linux_state, enabled = lambda item:pause_a_and_b),
MenuItem(text = '开启脚本', action = run_resume_kali_linux, checked = lambda item: run_resume_kali_linux_state, enabled = lambda item:resume_a_and_b),
MenuItem(text = '停止脚本', action = run_stop_kali_linux, checked = lambda item: run_stop_kali_linux_state, enabled = lambda item:stop_a_and_b),
)
),
item("程序列表",
menu(
MenuItem(text = '重启脚本', action = restart),
MenuItem(text = '退出脚本', action = on_exit),
)
),
MenuItem(text = 'Python检测子系统启动', action = run_start_kali_linux, default = True, visible = False,checked = lambda item:run_start_kali_linux_state),
)
).run()
可以创建bat+vbs来取消窗口
环境:脚本文件名:1-TP.py,bat如下:
python 1-TP.py
环境:bat文件名: 1-TP.bat,vbs如下:
Set ws = CreateObject("Wscript.Shell")
ws.run"cmd /c 1-TP.bat",0
创建一个vbs的快捷方式,放入启动项中,就可以实现开机自启。