python脚本实现进程保护

python脚本实现youtube-dl进程保护

参考链接:

Python实现进程守护

环境配置:

1.系统环境:Windows 7 64bit
2.编译环境:Python3.4.3
3.依赖库: os subprocess sys
4.其他工具:翻qiang工具( - - )、youtube-dl.exe、ffmpeg.exe
5.前置条件:通畅的网络

脚本由来

在油管上找到一些学习资源,无奈城墙高筑,在线看呢会卡的不行,鉴于自己的工具与网速都不能支持自己顺畅的享受网络自由,只好退而求其次,下载!高清!字幕!线下看!哼!
当然首选github上大几k星的强大工具youtube-dl。如何使用,英文好一点的可以直接去读git上的README,英文不太强的google一下就能搜出一堆一堆的使用教程,本人比较懒,显示搜索,不能满足自己的需要时才去读官方文档。
荐读:
使用youtube-dl下载国外视频
美滋滋的下载去忙别的事,过一会发现,竟然退出了!奥~一拍大腿,城墙牛逼啊,工具不稳啊,咋办啊?算了!活学活用,用python写个保护进程脚本吧。正好公司的项目出现严重一个bug:主程序莫名自杀!如今打个补丁就是写个shell脚本重启主程序,很简单,后期会加硬件看门狗。
那就开搞吧!

代码浅析

流程图

Created with Raphaël 2.1.0 打开cmd 在cmd中启动脚本(url是参数) youtube-dl进程是否存活 continue 重新启动 异常退出则重启 下载完成 yes no yes no

脚本demo

#!/usr/bin/python
#-*- coding:utf-8 -*-
"""
名称:youtube-dl进程检查脚本
作者:pg
时间:2017-12-28
功能:下载已知url的油管视频,并根据youtube-dl进程名称,判断进程是否存在,执行退出保护操作
参数:p_name:进程名称 命令行操作要注意添加 url
"""
import subprocess
import os
import sys
import logging
logging.basicConfig(level=logging.DEBUG) 
#初始化进程名称和命令路径
#使用参数方式传递程序名称和程序路径
p_name = sys.argv[1]
#p_path = sys.argv[2]
#logging.debug(p_name) 
#Linux
#p_name = "redis"
#p_path = "/usr/local/redis-2.8.11/src/redis-server/usr/local/redis-2.8.11/redis.conf"
#Windows
p_name = "youtube-dl -f 137+140 --write-auto-sub " + p_name + " --proxy \"https://127.0.0.1:38251\" "
p_path = "D:\\ffmpeg-20171120-8f4702a-win64-static\\YoutubeVideos\\"
#Linux平台调用ps命令/Win平台调用tasklist命令,判断进程是否存在,传入进程名称,返回为查询得到的进程个数
def process_exit(process_name):
    #Linux
    #p_checkresp = os.popen('ps aux | grep "' + process_name + '" | grep -v grep').readlines()

    #Windows,为避免进程名称被截断,输出格式为csv,使用tasklist /fo csv
    p_checkresp = os.popen('tasklist /fo csv | find "' + process_name + '"').readlines()
    return len(p_checkresp)
#Linx平台调用os.system方法启动命令/Win平台调用os.startfile方法启动命令,传入命令路径,无返回值
def process_exec(process_path):
    #将工作目录切换到启动脚本所在目录,解决部分进程启动时依赖工作目录问题
    os.chdir(os.path.dirname(process_path))
    #Linxu
    #os.system(process_path)
    #Windows
    proc = subprocess.Popen(p_name,shell = True)                                                             
    proc.wait()
    #捕捉子进程返回值,判断正常退出or异常退出
    if proc.returncode == 0:
        print ("proc exit")
        sys.exit(0)
    else:
        pass
#主函数
if __name__ == '__main__':
    while True:
        #查询进程个数大于1,不做任何操作
        if process_exit(p_name) >= 1:
            print(0)
            continue
        #查询进程个数等于0
        elif process_exit(p_name) == 0:
            #执行启动命令
            process_exec(p_path)
            print("~~~restart now~~~")
        #其他问题,退出
        else:
             print ("sys exit")
             sys.exit(0)

Ubuntu环境未测试,想来更是简单可行的
cmd 中敲命令:

python protect_download_thread.py https://www.youtube.com/watch?v=IaCgX3BQbD0

回顾与总结

  • 在cmd中执行python脚本,在python脚本中启动cmd命令行下的工具。
  • python大法好
  • 人生苦短
  • 哈哈哈

猜你喜欢

转载自blog.csdn.net/qq_30650153/article/details/78935663