MattG
MattG

Reputation: 1932

How to confirm Python Simple HTTP Server is running

I have a Python Simple HTTP server running on a Raspberry Pi, using openCV, I am using this code below to serve a video stream from a webcam over ngrok. I want to ensure it stays running remotely, as I have had it lock-up a few times on me and I need to manually restart it. I am not sure of the reason it periodically fails as I am running the script at startup and can't seem to reproduce the error when I run it from the console.

How can I ensure the HTTP server is running? The docs don't seem to cover this, so maybe it's more of a Linux question?

Here is the working code:

import http.server
import socketserver
import cv2
import time

PORT = 8000


cap = cv2.VideoCapture(0)

class MyHandler(http.server.BaseHTTPRequestHandler):

    def do_GET(self):

        if self.path.startswith('/image'):
            self.send_response(200)
            self.send_header("Content-type", "image/jpeg")
            self.end_headers()

            ret, frame = cap.read()
            _, jpg = cv2.imencode(".jpg", frame)

            self.wfile.write(jpg)
        else:
            self.send_response(404)
        


myserver = socketserver.TCPServer(("", PORT), MyHandler) 

with myserver as httpd:
    print("Serving at port ", PORT)
    try:
        httpd.serve_forever()
    except:
        pass

My plan is to run this script in parallel:

while True:
    serverActive = #someway of confirming server is active (how can I do this?)
    if serverActive = False
        try:
            #attempt to restart server
            startServer = subprocess.Popen(["/home/pi/Desktop/startServer.py"], stdin=subprocess.PIPE)
        except:
            pass
    time.sleep(5000)

Upvotes: 0

Views: 1086

Answers (1)

ti7
ti7

Reputation: 18792

There are many ways to have "one of" something in a computer

It may be possible for you simply catch the port already being used (I suspect the server may raise already for this)

If not, (or if you want to run on a variety of or several ports, etc.), you may find a filesystem lock to be most convenient!

import fcntl
import os
import sys

RUN_LOC = "/var/run/myapp"
with open(RUN_LOC, r+) as fd:
    try:  # try to acquire a lock to exclude other programs from access
        fcntl.fcntl(fd, fcntl.LOCK_EX)  # lock released when fd is closed
    except OSError:  # lock failed
        sys.exit("failed to lock; owned by PID: {}".format(fd.read())
    fd.write(os.getpid())  # no competition for file as lock is owned
    fd.truncate()  # may have less content than before (PID 5 vs 10)

    # serve here in with context

Upvotes: 1

Related Questions