74

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).

Suz
  • 3,744
  • 3
  • 23
  • 26
  • 10
    dont use the `&` and use `ctrl+C` instead :P – Joran Beasley Sep 28 '12 at 20:50
  • @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? – Rob W Sep 28 '12 at 20:51
  • 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. – Suz Sep 28 '12 at 20:52
  • ^ thats why i didnt post it as an answer ... its not really different than the way she's doing it now – Joran Beasley Sep 28 '12 at 20:54
  • 2
    but I think 99% of people just kill it with `ctrl+c` IRL – Joran Beasley Sep 28 '12 at 20:55
  • 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. – user650654 Sep 28 '12 at 21:10
  • from python http://stackoverflow.com/questions/19570591/how-do-i-kill-simplehttpserver-from-within-a-python-script – Ciro Santilli OurBigBook.com Aug 04 '16 at 13:03
  • check out this solution http://stackoverflow.com/a/38943044/2248627 – Levon Aug 14 '16 at 14:13

9 Answers9

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?

xbello
  • 7,223
  • 3
  • 28
  • 41
  • 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. – Suz Sep 28 '12 at 21:01
  • 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. – xbello Sep 28 '12 at 21:07
  • This [answer](http://stackoverflow.com/a/1112350/1688590) shows how to implement a simple catcher for SIGINT (Ctrl+C) and exit without "traceback". – xbello Sep 28 '12 at 21:12
  • 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. – Jonathan Vanasco Sep 28 '12 at 21:35
  • 1
    @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. – Suz Sep 28 '12 at 21:43
  • `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 `&`. – Jonathan Vanasco Sep 28 '12 at 22:44
42

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.

codersaif
  • 946
  • 9
  • 15
19
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.

Ruben Helsloot
  • 12,582
  • 6
  • 26
  • 49
Abdennour TOUMI
  • 87,526
  • 38
  • 249
  • 254
14

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

Lachezar
  • 6,523
  • 3
  • 33
  • 34
  • 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. – Reinout van Rees Nov 14 '12 at 21:40
  • Thank you, this is the only thing that worked for me – neaumusic Jun 20 '14 at 00:06
  • 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 & – Juan Lanus Oct 15 '15 at 15:48
12

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

This solution worked for me: https://stackoverflow.com/a/22533929/573216

Community
  • 1
  • 1
dirkk0
  • 2,460
  • 28
  • 34
  • 5
    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! – David Parks Oct 27 '17 at 18:04
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.

Erk
  • 1,159
  • 15
  • 9
  • 1
    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! – Anomaly Feb 23 '19 at 07:01
  • 1
    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). – Anomaly Feb 23 '19 at 07:03
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.

Serge Stroobandt
  • 28,495
  • 9
  • 107
  • 102
dm03514
  • 54,664
  • 18
  • 108
  • 145
  • That does look like a reasonable solution, though a bit more than I was looking for. – Suz Sep 28 '12 at 21:45
0

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

Serge Stroobandt
  • 28,495
  • 9
  • 107
  • 102
small_data88
  • 380
  • 1
  • 10
  • I'm willing to bet you don't have a terminal `&` in your command. ctrl-c does nothing with the ampersand. – Erk Jul 27 '18 at 23:03
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.

Amit Ghosh
  • 1,500
  • 13
  • 18