如何定时自启动与自关闭一些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)。
精彩评论