Как очистить порт при перезапуске django

Часто при перезапуске сервера Django, если я использую тот же номер порта, я получаю сообщение "порт уже используется". Впоследствии мне нужно каждый раз увеличивать номер порта, чтобы избежать этого.

Однако это не так на всех серверах, поэтому мне интересно, как я могу добиться этого в текущей системе, над которой я работаю?

Кстати, платформа Ubuntu 8.10

Ответ 1

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

Ответ 2

Я нашел эту информацию (первоначально от Kristinn Örn Sigurðsson), чтобы решить мою проблему:

Чтобы убить его с помощью -9, вам нужно будет указать все запущенные процессы manage.py, например:

ps aux | grep -i manage

Вы получите аналогичный результат, если вы начали работу со многими портами:

14770     8264  0.0  1.9 546948 40904 ?        S    Sep19   0:00 /usr/local/bin/python manage.py runserver 0.0.0.0:8006
14770    15215  0.0  2.7 536708 56420 ?        S    Sep13   0:00 /usr/local/bin/python manage.py runserver 0.0.0.0:8001
14770    30144  0.0  2.1 612488 44912 ?        S    Sep18   0:00 /usr/local/bin/python manage.py runserver 0.0.0.0:8000
14770    30282  0.0  1.9 678024 40104 ?        S    Sep18   0:00 /usr/local/bin/python manage.py runserver 0.0.0.0:8002
14770    30592  0.0  2.1 678024 45008 ?        S    Sep18   0:00 /usr/local/bin/python manage.py runserver 0.0.0.0:8003
14770    30743  0.0  2.1 678024 45044 ?        S    Sep18   0:00 /usr/local/bin/python manage.py runserver 0.0.0.0:8004

Затем вам нужно будет выбрать pid (это второй номер слева) для правильного процесса manage.py(python manage.py runningerver... и т.д.) и выполните следующие действия:

kill -9 pid

В приведенном выше примере, если вы хотите освободить порт 8000, вы должны:

kill -9 30144

Ответ 3

Если команда ps aux (в соответствии с ответом Meilo) не отображает процесс, который вы хотите убить, но показывает порт, активный в сетевой активности netstat -np | grep 8004, попробуйте эту команду (работайте на Ubuntu).

sudo fuser -k 8004/tcp

где as, 8004 - номер порта, который вы хотите закрыть. Это должно убить все процессы, связанные с портом 8004.

Ответ 4

Нет, он не идиот. То же самое происходит со мной. По-видимому, это ошибка с процессом UUID python с продолжением работы после закрытия сервера django, который связывает порт.

Ответ 5

fuser -k 8000/tcp

Запуск в терминале работает в ubutu. 8000 - это порт.

Ответ 6

Эта ошибка возникает из-за того, что сервер уже запущен.

Фон

Я отвечаю на более общий уровень, не свойственный Django, как задает оригинальный вопрос. Так что те, кто приземляется здесь из Google, могут легко решить проблему.

Решение

Когда вам нужно очистить порт, все, что вам нужно сделать, это эти два шага

  • В терминальном прогоне fg
  • Нажмите Control-C (если на Mac)

Описание

fg выводит процесс на передний план. Затем Control-C останавливает сервер.

Пример

У меня была эта проблема с моим портом 8000 при запуске приложения angular. Я получал сообщение об ошибке при запуске npm start

Failed at the angular-seed@0.0.0 start script error

Итак, я запустил fg, затем остановил сервер с помощью Control-C

fg

Затем я смог успешно запустить сервер

npm start

Ответ 8

Введите fg в терминал для вывода фоновой задачи на передний план.

Нажмите Ctrl + C, чтобы закрыть/остановить работающий сервер.

Ответ 9

Если номер порта, который вы пытаетесь, составляет 8001, используйте эту команду

sudo fuser -k 8001/tcp

Ответ 10

sudo lsof -t -i tcp:8000 | xargs kill -9

Если вы хотите освободить 8000 порт, чем только команду копирования и вставить в свой cmd, он попросит пароль sudo. И тогда вам хорошо идти.

Ответ 11

Вы не хотите просто увеличивать номер порта при перезапуске сервера Django. Это приведет к одновременному запуску нескольких экземпляров сервера Django. Лучшее решение - убить текущий экземпляр и запустить новый экземпляр.

Для этого у вас есть несколько вариантов. Самый простой -

Python2: $ killall -9 python

Python3: $ killall -9 python3

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

$ kill <pid> где <pid> - это идентификатор процесса, найденный из простой команды $ ps aux | grep python.

Ответ 12

netstat -tulpn |grep 8000|awk '{print $7}'|cut -d/ -f 1|xargs kill

Ответ 13

Как сказал mipadi, вы должны завершать сервер (ctrl + c) и возвращаться в командную строку перед вызовом manage.py runserver снова.

Единственное, что может нарушить это, было бы, если бы вам каким-то образом удалось заставить action работать как демон. Если это так, я предполагаю, что вы используете тестовый сервер Django как настоящий веб-сервер, который вы НЕ должны делать. Тест-сервер Django является однопоточным, медленным и хрупким, подходящим только для локальной разработки.

Ответ 14

В Leopard я запускаю Activity Monitor и убиваю python. Решаемые.

Ответ 15

Случилось так часто, что я написал псевдоним, чтобы убить процесс с помощью python в имени (осторожно, если у вас есть другие подобные процессы). Теперь я просто запускаю (нет Ubuntu)

kill $(ps | grep "python" | awk "{print $1}")

Вы даже можете добавить python manage.py runserver ... к тому же псевдониму, чтобы вы могли перезапустить с двумя нажатиями клавиш.

Ответ 16

Вы, должно быть, делали control + z.. Вместо этого выполняйте контроль + c, который убьет сеанс сервера... Приветствия!

Ответ 17

Перегрузка из fooobar.com/questions/57855/...:

Вы можете использовать этот script вместо ./manage.py runserver. Я положил его в scripts/runserver.sh.

#!/bin/bash

pid=$(ps aux | grep "./manage.py runserver" | grep -v grep | head -1 | xargs | cut -f2 -d" ")

if [[ -n "$pid" ]]; then
    kill $pid
fi

fuser -k 8000/tcp
./manage.py runserver

Ответ 18

Добавьте следующую библиотеку в manage.py

импорт ОС
подпроцесс импорта
импорт ре

Теперь добавьте следующий код Python после if __name__ == "__main__":

ports = ['8000']
popen = subprocess.Popen(['netstat', '-lpn'],
                         shell=False,
                         stdout=subprocess.PIPE)
(data, err) = popen.communicate()
pattern = "^tcp.*((?:{0})).* (?P<pid>[0-9]*)/.*$"
pattern = pattern.format(')|(?:'.join(ports))
prog = re.compile(pattern)
for line in data.split('\n'):
    match = re.match(prog, line)
    if match:
        pid = match.group('pid')
        subprocess.Popen(['kill', '-9', pid])

Сначала он найдет идентификатор процесса порта 8000, уничтожит его и затем перезапустит ваш проект. Теперь каждый раз вам не нужно убивать пид вручную.