0

I already searched for solutions to my questions and found some, but they don't work for me or are very complicated for what I want to achieve.

I have a python (2.7) script that creates 3 BaseHTTPServers using threads. I now want to be able to close the python script from itself and restart it. For this, I create an extra file called "restart_script" with this content:

sleep 2
python2 myScript.py

I then start this script and after that, close my own python script:

os.system("nohup bash restart_script & ")
exit()

This works quite well, the python script closes and the new one pops up 2 seconds later, but the BaseHTTPServers do not come up, the report that the Address is already in use. (socket.error Errno 98).

I initiate the server with:

httpd = server_class((HOST_NAME, PORT_NUMBER), MyHandler)

Then I let it serve forever:

thread.start_new_thread(httpd.serve_forever, tuple())

I alternatively tried this:

httpd_thread = threading.Thread(target=httpd.serve_forever)
httpd_thread.daemon = True
httpd_thread.start()

But this has the same result.

If I kill the script using strg+c and then start it right again right after that, everything works fine. I think as long as I want to restart the script from its own, the old process is still somehow active and I need to somehow disown it so that the sockets can be cleared.

I am running on Linux (Xubuntu).

How can I really really kill my own script and then bring it up again seconds later so that all sockets are closed?

2
  • Have you tried socket reuse: stackoverflow.com/questions/6380057/… Commented Dec 8, 2014 at 20:22
  • Yes, I have tried using httpd.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) before serve_forever Commented Dec 8, 2014 at 21:01

1 Answer 1

1

I found an answer to my specific problem.

I just use another script which starts my main program using os.system(). If the script wants to restart, I just close it regularly and the other script just starts it again, over and over...

If I want to actually close my script, I add a file and check in the other script if this file exists..

The restart-helper-script looks like this:

import os, time

cwd = os.getcwd()

#first start --> remove shutdown:
try:
    os.remove(os.path.join(cwd, "shutdown"))
except:
    pass

while True:
    #check if shutdown requested:
    if os.path.exists(os.path.join(cwd, "shutdown")):
        break
    #else start script:
    os.system("python2 myMainScript.py")
    #after it is done, wait 2 seconds: (just to make sure sockets are closed.. might be optional)
    time.sleep(2)
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.