How do I shut down a python simpleHTTPserver?
Asked Answered
M

10

78

So I'm trying to learn d3, and the wiki suggested that

To view the examples locally, you must have a local web server. Any web server will work; for example you can run Python's built-in server:

python -m SimpleHTTPServer 8888 &

Great... only now I have a server running... but at some point I think I should probably shut that down again.

Is there a better way of shutting it down than using kill <pid>? That seems like kind of a big hammer for a little job.

(I'm running Mac OS 10.6.8 (Snow Leopard))

FWIW: ctrl+c gives about 10 lines of traceback, complaining about being interrupted.

kill -3 <pid> gives a Finder warning in a separate window 'Python quit unexpectedly'.

The default kill <pid> and kill -15 <pid> are relatively clean (and simple).

Marion answered 28/9, 2012 at 20:48 Comment(8)
dont use the & and use ctrl+C instead :PSalomie
@JoranBeasley is right. I use SimpleHTTPServer quite often (even added alias p for it). To stop the server, I just press Ctrl+C. Joran, why did you not post that as an answer?Hardee
keyboard interrupt == similarly ugly, besides then it's sitting there in a window. I can do that, I was just hoping there was a slightly more elegant way.Marion
^ thats why i didnt post it as an answer ... its not really different than the way she's doing it nowSalomie
but I think 99% of people just kill it with ctrl+c IRLSalomie
If you're using bash or similar shell, you can all do fg then a control-C (if this is the last process put in background). Or you can do kill %% (again, if this is the last process put in background). You can also specify a number n kill %n if you know which job number. Run jobs to list the jobs in background. Read more about this in the shell man-page.Lease
from python #19571091Exegetic
check out this solution https://mcmap.net/q/266252/-how-do-i-kill-simplehttpserver-from-within-a-python-scriptIstle
D
44

You are simply sending signals to the processes. kill is a command to send those signals.

The keyboard command Ctrl+C sends a SIGINT, kill -9 sends a SIGKILL, and kill -15 sends a SIGTERM.

What signal do you want to send to your server to end it?

Drawtube answered 28/9, 2012 at 20:56 Comment(6)
I'd like to send it whichever signal is appropriate to exit it gracefully without leaving garbage in the system or on my screen. In the case of ctrl+c, I get about 10 lines of a traceback complaining that it was interrupted. That looks like pulling the plug without shutting down the system.Marion
Then you have to catch and manage the reception of that signals, clean the house and exit the program (or not, the python interpreter doesn't close on Ctrl+C). The standard module signal might be useful.Drawtube
This answer shows how to implement a simple catcher for SIGINT (Ctrl+C) and exit without "traceback".Drawtube
just to add/clarify, kill isn't overkill. it just sends a signal, defaulting to "hey, shut down". your app can treat the different signals differently. SIGTERM, SIGKILL, SIGHUP, SIGQUIT etc can all be sent with kill. you should read up on kill and the different types of processes.Tasteful
@Jonathan yes, I have just read the man pages. However, I was kinda thinking that python would have something like 'bye' or 'q' for shutting down a running module. Apparently, I can use the signals module to catch one of these and shutdown gracefully, but that doesn't come already packaged with the SimpleHTTPServer. So I will probably do as the 99% do.Marion
Signal and SimpleHTTPServer are both part of the Python standard library, they come within Python. killing with ctl-c is totally fine , but I personally just send a kill signal because i like using &.Tasteful
V
43

if you have started the server with

python -m SimpleHTTPServer 8888 

then you can press ctrl + c to down the server.

But if you have started the server with

python -m SimpleHTTPServer 8888 &

or

python -m SimpleHTTPServer 8888 & disown

you have to see the list first to kill the process,

run command

ps

or

ps aux | less

it will show you some running process like this ..

PID TTY          TIME CMD
7247 pts/3     00:00:00 python
7360 pts/3     00:00:00 ps
23606 pts/3    00:00:00 bash

you can get the PID from here. and kill that process by running this command..

kill -9 7247

here 7247 is the python id.

Also for some reason if the port still open you can shut down the port with this command

fuser -k 8888/tcp

here 8888 is the tcp port opened by python.

Hope its clear now.

Viafore answered 10/7, 2015 at 6:52 Comment(2)
this approach helps avoid unnecessary steps when running the server in the future.Kimber
On MacOS, use lsof -nti:8888 | xargs kill -9 to free the port, as the fuser command does not support the -k switch.Jezebel
S
20
MYPORT=8888; 
kill -9 `ps -ef |grep SimpleHTTPServer |grep $MYPORT |awk '{print $2}'`

That is it!

Explain command line :

  • ps -ef : list all process.

  • grep SimpleHTTPServer : filter process which belong to "SimpleHTTPServer"

  • grep $MYPORT : filter again process belong to "SimpleHTTPServer" where port is MYPORT (.i.e: MYPORT=8888)

  • awk '{print $2}' : print second column of result which is the PID (Process ID)

  • kill -9 <PID> : Force Kill process with the appropriate PID.

Seymourseys answered 13/5, 2016 at 15:39 Comment(2)
Wow! So simple!Halifax
Thank you for answering the question!Che
F
14

or you can just do kill %1, which will kill the first job put in background

Forsworn answered 28/9, 2012 at 21:18 Comment(3)
You don't know for sure whether it is the first background job. It doesn't really answer the question, as using 'kill' is already in the question.Polyadelphous
Thank you, this is the only thing that worked for meNaive
This answer is quite effective. @Reinout it you are unsure maybe with the command "jobs" you can see the background jobs lineup, like: [1]+ Running python -m SimpleHTTPServer 8000 &Neale
R
13

Turns out there is a shutdown, but this must be initiated from another thread.

This solution worked for me: https://mcmap.net/q/266253/-shutdown-socketserver-serve_forever-in-one-thread-python-application

Raven answered 17/1, 2015 at 16:6 Comment(1)
Thank you for being the only answer that pointed to a programmatic way of shutting down the server. This should be among the highest voted answers!Kehoe
G
5

When you run a program as a background process (by adding an & after it), e.g.:

python -m SimpleHTTPServer 8888 &

If the terminal window is still open you can do:

jobs

To get a list of all background jobs within the running shell's process.

It could look like this:

$ jobs
[1]+  Running                 python -m SimpleHTTPServer 8888 &

To kill a job, you can either do kill %1 to kill job "[1]", or do fg %1 to put the job in the foreground (fg) and then use ctrl-c to kill it. (Simply entering fg will put the last backgrounded process in the foreground).

With respect to SimpleHTTPServer it seems kill %1 is better than fg + ctrl-c. At least it doesn't protest with the kill command.

The above has been tested in Mac OS, but as far as I can remember it works just the same in Linux.

Update: For this to work, the web server must be started directly from the command line (verbatim the first code snippet). Using a script to start it will put the process out of reach of jobs.

Gogol answered 27/7, 2018 at 22:50 Comment(2)
This is the only answer that I can do from the command line with just a few keystrokes, and prevent python spewing tracebacks onto the command line. Thanks!Walling
Also for those who don't know, if you didn't have the foresight to start python -m SimpleHTTPServer 8888 with &, just do Ctrl-Z first to send it the background, then as before run jobs to see its number, then kill %1 to kill it (if it was job 1).Walling
P
3

It seems like overkill but you can use supervisor to start and stop your simpleHttpserver, and completely manage it as a service.

Or just run it in the foreground as suggested and kill it with CtrlC.

Popsicle answered 28/9, 2012 at 20:53 Comment(1)
That does look like a reasonable solution, though a bit more than I was looking for.Marion
V
1

Just kill the terminal where you run the command to start the http server.

Vizcacha answered 13/9, 2023 at 23:35 Comment(2)
Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.Orpiment
Hi @tphan, welcome to Stack Overflow! Thanks for your answer, "kill the terminal" is indeed not yet in the list of answers. I hope you have a good time here.Tetraspore
D
0

Hitting CtrlC once(wait for traceback), then hitting CtrlC again did the trick for me :)

Devitrify answered 17/3, 2015 at 16:26 Comment(1)
I'm willing to bet you don't have a terminal & in your command. ctrl-c does nothing with the ampersand.Gogol
P
0

Here is another solution.

Suppose You have started the server using this command -

python3 -m http.server 7800

To kill that process use -

pkill -9 -f  'python3 -m http.server 7800

That's it.

Parasitology answered 26/4, 2021 at 7:58 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.