Ответ 1
Вы получаете это сообщение, потому что сервер уже запущен (возможно, в фоновом режиме). Обязательно запустите процесс (выведите его на передний план и нажмите ctrl-c), чтобы остановить процесс.
Часто при перезапуске сервера Django, если я использую тот же номер порта, я получаю сообщение "порт уже используется". Впоследствии мне нужно каждый раз увеличивать номер порта, чтобы избежать этого.
Однако это не так на всех серверах, поэтому мне интересно, как я могу добиться этого в текущей системе, над которой я работаю?
Кстати, платформа Ubuntu 8.10
Вы получаете это сообщение, потому что сервер уже запущен (возможно, в фоновом режиме). Обязательно запустите процесс (выведите его на передний план и нажмите ctrl-c), чтобы остановить процесс.
Я нашел эту информацию (первоначально от 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
Если команда ps aux
(в соответствии с ответом Meilo) не отображает процесс, который вы хотите убить, но показывает порт, активный в сетевой активности netstat -np | grep 8004
, попробуйте эту команду (работайте на Ubuntu).
sudo fuser -k 8004/tcp
где as, 8004 - номер порта, который вы хотите закрыть. Это должно убить все процессы, связанные с портом 8004.
fuser -k 8000/tcp
Запуск в терминале работает в ubutu. 8000
- это порт.
Я отвечаю на более общий уровень, не свойственный Django, как задает оригинальный вопрос. Так что те, кто приземляется здесь из Google, могут легко решить проблему.
Когда вам нужно очистить порт, все, что вам нужно сделать, это эти два шага
fg
fg выводит процесс на передний план. Затем Control-C останавливает сервер.
У меня была эта проблема с моим портом 8000 при запуске приложения angular. Я получал сообщение об ошибке при запуске npm start
Итак, я запустил fg
, затем остановил сервер с помощью Control-C
Затем я смог успешно запустить сервер
Я использую pkill -If 'manage.py'
(-I
означает интерактивный, -f
соответствует больше, чем просто имя процесса). См. Как убить все процессы с заданным частичным именем? для получения дополнительной информации о pkill.
Введите fg
в терминал для вывода фоновой задачи на передний план.
Нажмите Ctrl + C, чтобы закрыть/остановить работающий сервер.
Если номер порта, который вы пытаетесь, составляет 8001, используйте эту команду
sudo fuser -k 8001/tcp
sudo lsof -t -i tcp:8000 | xargs kill -9
Если вы хотите освободить 8000 порт, чем только команду копирования и вставить в свой cmd, он попросит пароль sudo. И тогда вам хорошо идти.
Вы не хотите просто увеличивать номер порта при перезапуске сервера Django. Это приведет к одновременному запуску нескольких экземпляров сервера Django. Лучшее решение - убить текущий экземпляр и запустить новый экземпляр.
Для этого у вас есть несколько вариантов. Самый простой -
Python2: $ killall -9 python
Python3: $ killall -9 python3
Если по какой-то причине это не сработает, вы можете сделать
$ kill <pid>
где <pid>
- это идентификатор процесса, найденный из простой команды $ ps aux | grep python
.
netstat -tulpn |grep 8000|awk '{print $7}'|cut -d/ -f 1|xargs kill
Как сказал mipadi, вы должны завершать сервер (ctrl + c) и возвращаться в командную строку перед вызовом manage.py runserver
снова.
Единственное, что может нарушить это, было бы, если бы вам каким-то образом удалось заставить action работать как демон. Если это так, я предполагаю, что вы используете тестовый сервер Django как настоящий веб-сервер, который вы НЕ должны делать. Тест-сервер Django является однопоточным, медленным и хрупким, подходящим только для локальной разработки.
В Leopard я запускаю Activity Monitor и убиваю python. Решаемые.
Случилось так часто, что я написал псевдоним, чтобы убить процесс с помощью python
в имени (осторожно, если у вас есть другие подобные процессы). Теперь я просто запускаю (нет Ubuntu)
kill $(ps | grep "python" | awk "{print $1}")
Вы даже можете добавить python manage.py runserver ...
к тому же псевдониму, чтобы вы могли перезапустить с двумя нажатиями клавиш.
Вы, должно быть, делали control + z.. Вместо этого выполняйте контроль + c, который убьет сеанс сервера... Приветствия!
Перегрузка из 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
Добавьте следующую библиотеку в 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, уничтожит его и затем перезапустит ваш проект. Теперь каждый раз вам не нужно убивать пид вручную.
netstat -ntlp
Смотрите мой полный ответ здесь. fooobar.com/info/57855/...