Python - 每n秒检查一次子进程活动

时间:2017-11-22 12:02:02

标签: python ffmpeg subprocess

我正在尝试制作python脚本(目前在Windows上),它将打开一些子进程(将无限运行),并且脚本应该定期检查所有打开的子进程是否仍能正常工作。所以我应该用while循环来完成。

子流程是关于FFMPEG直播的。

问题是当我在循环中执行time.sleep(n)时,因为每个FFMPEG直播都会停止,所以我认为time.sleep会影响所有子子进程。

我不知道如何让它发挥作用。

这是我的python代码:

import os, time, sys, datetime, smtplib, configparser, logging, subprocess, psutil
import subprocess

def forwardudpstream(channel_number, ip_input, ip_output):
    try:
        ffmpeg_command = 'ffmpeg -i udp://' + ip_input + ' -vcodec copy -acodec copy -f mpegts "udp://' + ip_output + '?pkt_size=1316"'
        ffmpeg_output = subprocess.Popen(ffmpeg_command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=False)
        return str(ffmpeg_output.pid)
    except:
        print ("Exception!")
        return '0'

while True:
    configuration = 'config.ini'
    channel_list_file = 'CHANNEL_LIST.conf'
    pid_folder = "D:\\Forward_UDP_Stream\\pids\\"
    channel_list = [line.rstrip('\n') for line in open(channel_list_file)]
    for line in channel_list:
        if not line.startswith('#') and ('|' in line):
            channel_number, ip_input, ip_output = line.split('|')
            print('----------')
            print("Channel number = ", channel_number)
            print("IP Input = ", ip_input)
            print("IP Output = ", ip_output)
            pid_file_found = False
            print("Checking if pid file exists...")
            for pidfile in os.listdir(pid_folder):
                if pidfile.startswith(channel_number + '-'):
                    print("Pid file is found for this channel.")
                    pid_file_found = True
                    pid = int(pidfile.split('-')[1].split('.')[0])
                    print("PID = ", str(pid))
                    print("Checking if corresponding process is active...")
                    if not psutil.pid_exists(pid):
                        print("Process is not active.")
                        print("Removing old pid file.")
                        os.remove(pid_folder + pidfile)
                        print("Starting a new process...")
                        pid_filename = channel_number + '-' + forwardudpstream(channel_number, ip_input, ip_output) + '.pid'
                        pid_file = open(pid_folder + pid_filename, "a")
                        pid_file.write("Process is running.")
                        pid_file.close()
                    else:
                        print("Process is active!")
                    break
            if pid_file_found == False:
                print("Pid file is not found. Starting a new process and creating pid file...")
                pid_filename = channel_number + '-' + forwardudpstream(channel_number, ip_input, ip_output) + '.pid'
                pid_file = open(pid_folder + pid_filename, "a")
                pid_file.write("Process is running.")
                pid_file.close()
            time.sleep(10)

这是我的 CHANNEL_LIST.conf 文件示例:

1|239.1.1.1:10000|239.1.1.2:10000
2|239.1.1.3:10000|239.1.1.4:10000

也许还有一些其他解决方案可以让等待和子流程协同工作。有没有人有想法?

更新 当我从subprocess命令中删除stdout=subprocess.PIPE部分时,我终于使它工作了。 现在它看起来像这样:

ffmpeg_output = subprocess.Popen(ffmpeg_command, stderr=subprocess.STDOUT, shell=False)

所以现在我很困惑为什么以前的命令出问题......? 有什么解释吗?

0 个答案:

没有答案