开发者

如何定时自启动与自关闭一些python脚本

目录
  • 定时自启动与自关闭一些python脚本
    • 思路是这样的
    • 总之为了避免这个情况
  • 总结

    定时自启动与自关闭一些python脚本

    是Windows系统,要是linux就好了。

    思路是这样的

    首先到早上6点整启动脚本或某个软件,然后记录下对应的pid,等到了晚上18点整的时候,自动根据pid再杀死对应进程。

    定时开启与关闭用apscheduler,示例代码如下:

    from ahttp://www.devze.compscheduler.schedulers.blocking  import BlockingScheduler 
    
    def start_scripts():
    	pass
    	
    def kill_processes():
    	pass
    	
    if __name__ == "__main__":
        
    	scheduler = BlockingScheduler()javascript
    	# 添加定时任务(crontab格式)
    	scheduler.add_job(start_scripts, 'cron', hour=6, minute=0   # 启动 
    	scheduler.add_job(kill_processes, 'cron', hour=18, minute=0  # 终止 
    	print("监控程序已启动")
    	try:
    		scheduler.start() 
    	except (KeyboardInterrupt, SystemExit):
    		pass 
        

    为了保证启动程序的时候获取到对应的真实pid,使用subprocess依赖库

    import subprocess 
    
    
    try:
    	jssubprocess.Popen(
    		["python", script], 
    		cwd="d:/file/script/start.py",
    		creationflags=subprocess.CREATE_NEW_CONSOLE)
    except Exception as e:
    	print(f"启动失败:{str(e)}")
    	
    try:
    	proc = subprocess.Popen(
    		["d:/file/soft/server.exe"], 
    		cwd="d:/file/soft/")
    	pid = str(proc.pid)
    	with open("pid.txt", 'a') as f:         
            f.write(f"server.exe-pid={pid}\n")
    except Exception as e:
    	print(f"启动失败:{str(e)}")
    
    	

    启动脚本窗口的没有在这里获取pid,是因为一旦开启新窗口后,通过proc.pid获取的无效,AI说是:

    • 在Windows 7及更早版本中,创建新控制台时会生成conhost.exe 宿主进程
    • 返回的PID指向的是控制台宿主进程,而非实际目标进程
    • 新架构差异:Windows 8+ 采用了conhost与终端分离的新架构,而Wiwww.devze.comn7使用传统模式

    总之为了避免这个情况

    我在被启动的python脚本里面读取pid,使用的psutil库,如下:

    import psutil 
    
    current_process = psutil.Process()
    pid = str(current_process.pid)
    print(f"当前进程ID: {pid}")
    with open("pid.txt", 'a') as f:         
        f.write(f"script-1-pid={pid}\n") 

    这样就可以避免返回的pid异常问题了. 后期等到晚上18点的时候读取pid文件,按顺序kill即可。

    当然如果希望每隔一段时间执行一次,可以这样:

    def print_fun():
    	print("执行时间:", time.asctimhttp://www.devze.come())
    
    scheduler.add_job(print_fun, 'interval', seconds=10)
    

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜