Skip to content

Instantly share code, notes, and snippets.

@a4180p
Created August 7, 2014 11:40
Show Gist options
  • Select an option

  • Save a4180p/0ecbca61737c3efa30b3 to your computer and use it in GitHub Desktop.

Select an option

Save a4180p/0ecbca61737c3efa30b3 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, absolute_import, print_function
import gevent
import subprocess
from functools import partial
from six import int2byte, StringIO
import os
import logging
CMD = "/proc/{}/cmdline"
ENV = "/proc/{}/environ"
STDERR = "/proc/{}/fd/2"
ZERO = int2byte(0x00)
COLOR = {"AV_LOG_FORCE_COLOR": "TRUE"}
cmd = ["ffmpeg", "-y", "-i",
"/home/ponimas/tmp/test.mp4",
"-c:v", "h264", "-c:a", "copy",
"-f", "mp4", "/dev/null"]
def start_process(cmd, env=None):
if env is None:
env = {}
return subprocess.Popen(
cmd,
close_fds=True,
preexec_fn=os.setsid,
env=env,
stderr=subprocess.PIPE).pid
def monitor(pid):
with open(CMD.format(pid)) as cmd:
cmd_line = cmd.readline().split(ZERO)[:-1]
with open(ENV.format(pid)) as env:
env = dict(x.split("=") for x in
env.readline().split(ZERO) if x)
fd = os.open(STDERR.format(pid), os.O_NONBLOCK|os.O_RDONLY)
buff = StringIO()
for data in iter(partial(gevent.os.nb_read, fd, 2048), ""):
buff.write(data)
if data.endswith(("\r", "\n")):
print("from pid {} - {}".format(pid, buff.getvalue().strip()))
buff = StringIO()
gevent.sleep()
print("Process {} failed - restarting".format(pid))
pid = start_process(cmd_line, env)
gevent.spawn(monitor, pid)
if __name__ == "__main__":
import argparse
import gevent.backdoor
parser = argparse.ArgumentParser()
parser.add_argument("-p", type=int, nargs="+")
cmdargs = parser.parse_args()
if not cmdargs.p:
pid = start_process(cmd)
gevent.spawn(monitor, pid)
else:
for pid in cmdargs.p:
gevent.spawn(monitor, pid)
gevent.backdoor.BackdoorServer(("127.0.0.1", 12432), locals=locals(), banner="Hallo!!").serve_forever()
# while True:
# gevent.sleep(100)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment