Как закрыть python simpleHTTPserver?

поэтому я пытаюсь изучить d3 и wiki предложил

чтобы просмотреть примеры локально, необходимо иметь локальный веб-сервер. Любой веб-сервер будет работать; например, вы можете запустить встроенный Python сервер:

python -m SimpleHTTPServer 8888 &

большой... только теперь у меня работает сервер... но в какой-то момент я думаю, что, вероятно, я должен закрыть это снова.

есть ли лучший способ закрыть его, чем использовать kill <pid>? Это похоже на большой молоток для маленькой работы.

(я запускаю Mac OS 10.6.8 (Snow Leopard))

FWIW:ctrl+c дает около 10 строк трассировки, жалуясь на прерывание.

kill -3 <pid> дает предупреждение Finder в отдельном окне "Python неожиданно выйти".

по умолчанию kill <pid> и kill -15 <pid> относительно чистые (и простой).

8 ответов


вы просто посылаете сигналы процессам. kill - Это команда для отправки этих сигналов.

команда клавиатуры Ctrl+C (+C) отправляет SIGINT,kill -9 посылает SIGKILL, и kill -15 отправляет SIGTERM.

какой сигнал вы хотите отправить на свой сервер, чтобы закончить его?


если вы запустили сервер с

python -m SimpleHTTPServer 8888 

затем вы можете нажать ctrl + c, чтобы вниз по серверу.

но если вы запустили сервер с

python -m SimpleHTTPServer 8888 &

или

python -m SimpleHTTPServer 8888 & disown

вы должны сначала увидеть список, чтобы убить процесс,

выполнить команду

ps

или

ps aux | less

он покажет вам, какой процесс работает как это ..

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

вы можете получить PID отсюда. и убивать этот процесс, выполнив эту команду..

kill -9 7247

здесь 7247 является идентификатором python.

также по какой-то причине, если порт все еще открыт, вы можете закрыть порт с помощью этой команды

fuser -k 8888/tcp

здесь 8888-это tcp-порт, открытый python.

надеюсь теперь понятно.


или вы можете просто сделать kill %1, который убьет первое задание, поставленное в фоновом режиме


MYPORT=8888; 
kill -9 `ps -ef |grep SimpleHTTPServer |grep $MYPORT |awk '{print }'`

вот оно !!

объясните командную строку:

  • ps -ef : список всех процессов.

  • grep SimpleHTTPServer: процесс фильтрации, который принадлежит "SimpleHTTPServer"

  • grep $MYPORT: фильтр снова Процесс принадлежит "SimpleHTTPServer", где порт-MYPORT (.Я. e: MYPORT=8888)

  • awk '{print }': печать второго столбца результата, который является PID (идентификатор процесса)

  • kill -9 <PID>: процесс принудительного убийства с соответствующим PID.


Это кажется излишним, но вы можете использовать руководитель для запуска и остановки simpleHttpserver и полного управления им как сервисом.

или просто запустите его на переднем плане, как предложено, и убейте его с помощью control C


оказывается, есть завершение работы, но это должно быть инициировано из другого потока.

Это решение сработало для меня:https://stackoverflow.com/a/22533929/573216


нажатие ctrl + c один раз(подождите traceback), затем снова нажмите ctrl+c, чтобы сделать трюк для меня:)


при запуске программы в качестве фонового процесса (путем добавления & после него), например:

python -m SimpleHTTPServer 8888 &

если окно терминала все еще открыт, вы можете сделать:

jobs

чтобы получить список всех фоновых заданий в процессе запущенной оболочки.

это может выглядеть так:

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

чтобы убить работу, вы можете сделать kill %1 убить Иова" [1]", или сделать fg %1 чтобы поместить задание на передний план (fg), а затем использовать ctrl-c, чтобы убить его. (Просто введите fg будет помещен последний backgrounded процесс на переднем плане).

в отношении SimpleHTTPServer кажется kill %1 лучше, чем fg + ctrl-c. По крайней мере, он не протестует против команды убить.

выше было протестировано в Mac OS, но, насколько я помню, он работает точно так же в Linux.

обновление: для этого веб-сервер должен быть запущен непосредственно из командной строки (дословно первый фрагмент кода). Использование скрипта для его запуска поставит процесс вне досягаемости jobs.