Как мне отключить простой HTT-сервер на python?

Итак, я пытаюсь выучить d3, и вики предположил, что

Для локального просмотра примеров у вас должен быть локальный веб-сервер. Любой веб-сервер будет работать; Например, вы можете запустить встроенный сервер 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> относительно чисты (и просты).

9 ответов

Решение

Вы просто посылаете сигналы процессам. 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 - идентификатор питона.

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

fuser -k 8888/tcp

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

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

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

Это так!!

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

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

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

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

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

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

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

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

Это решение работало для меня: /questions/22569431/zavershenie-rabotyi-soket-servera-serveforever-v-odnopotochnom-prilozhenii-python/22569445#22569445

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

python -m SimpleHTTPServer 8888 &

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

jobs

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

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

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

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

По поводу SimpleHTTPServer похоже kill %1 лучше, чем fg + Ctrl-C. По крайней мере, это не протестует с командой kill.

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

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

Это кажется излишним, но вы можете использовать http://supervisord.org/ для запуска и остановки вашего простого сервера Http и полностью управлять им как сервисом.

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

Нажав Ctrl + C один раз (дождаться отслеживания), затем снова нажав Ctrl + C, я добился цели:)

Вот еще одно решение.

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

      python3 -m http.server 7800

Чтобы убить этот процесс, используйте -

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

Вот и все.

Другие вопросы по тегам