Сервер Rails говорит, что порт уже используется, как убить этот процесс?


275

Я на Mac, делаю:

rails server

Я получил:

2010-12-17 12:35:15] INFO  WEBrick 1.3.1
[2010-12-17 12:35:15] INFO  ruby 1.8.7 (2010-08-16) [i686-darwin10.4.0]
[2010-12-17 12:35:15] WARN  TCPServer Error: Address already in use - bind(2)
Exiting

Я знаю, что могу запустить один на новом порту, но я хочу убить этот процесс.

Ответы:


694

Предполагая, что вы хотите уничтожить все, что находится на порту 3000 (что обычно используется webrick), введите его в своем терминале, чтобы узнать PID процесса:

$ lsof -wni tcp:3000

Затем используйте число в столбце PID, чтобы завершить процесс:

$ kill -9 PID

4
не могли бы вы объяснить -wni
user993563

53
Просто для пояснения для новичков: во второй строке кода вы должны заменить PIDфактическое число, которое отображается в вашей консоли при вводе первой строки кода (например, 12345).
CodeBiker

5
Вы также можете найти PID, перейдя по каталогу rails к следующему файлу tmp / pids / server.pid
tandy

Это может произойти, если вы запускаете отладчик в RubyMine и он аварийно завершает работу или что-то ... Сервер останавливается, но отладчик продолжается ... В любом случае, это решение, которое я использовал, и оно отлично работает :)
J Smith

@tandy - это хороший способ получить PID для конкретного проекта, однако, иногда, когда процесс внезапно закрывается, файл может отсутствовать, но сервер все еще может работать. Выполнение всегдаlsof -wni tcp:3000 будет показывать все процессы, прослушивающие этот протокол: комбинация портов. (где 3000 следует заменить на порт локального сервера. Например, в Rails это 3000 по умолчанию).
SidOfc

125

kill -9 $(lsof -i tcp:3000 -t)


3
все в скобках будет возвращать идентификатор процесса, который использует порт 3000. И -tзначит, specifies that lsof should produce terse output with process identifiers only and no header - e.g., so that the output may be piped to kill(1).я думаю, вы знаете, что killбудете делать
Papouche Guinslyzinho

Это должен быть принятый ответ, так как это строка «все в одном». Поместите это в псевдоним, и все готово.
Nubtacular

Если бы объяснение было включено, это определенно стоило бы воздержаться.
mwfearnley

2
Это убьет все процессы, включая все открытые сессии браузера. Таким образом, вы хотите быть осторожным, когда вы попробуете это.
theterminalguy

1
Пожалуйста, смотрите мой комментарий о принятом ответе об использовании kill -9rote / привычно.
Линд

29

Вам нужно получить идентификатор процесса программы, используя TCP-порт 3000. Чтобы получить идентификатор процесса

lsof -i tcp:3000 -t

А затем, используя этот идентификатор процесса, просто убейте процесс, используя команду ubuntu kill.

kill -9 pid

Или просто запустите ниже упомянутую команду объединения. Сначала он получит pid, а затем убьет этот процесс.

kill -9 $(lsof -i tcp:3000 -t)

Пожалуйста, смотрите мой комментарий о принятом ответе об использовании kill -9rote / привычно.
Линд

17

Для любого, кто сталкивается с этим вопросом, которого нет на Mac: если вы знаете, что ваш сервер работает на порте 3000, вы можете сделать это за один раз, выполнив следующее:

fuser -k 3000/tcp

Но, как уже упоминал Тоби, реализация fuser в Mac OS довольно примитивна, и эта команда не будет работать на mac.


1
Это не будет работать на Mac (Mac был оговорен в вопросе), так как fuser принимает только c, f и u в качестве опций.
Тоби

Я обновил ответ, и он рассматривает, как использовать его для пользователей Mac. Нет причин отказываться от голосования, особенно с учетом того, что другие, в том числе и я, наткнулись на этот вопрос в прошлом, несмотря на то, что я не на Mac.
saneshark

Добавление -vфлага также показывает небольшое количество информации о том, какой процесс был убит. Так fuser -kv 3000/tcp. Увы, что у MacOS нет этой способности. kill $(lsof -ti tcp:3000)это довольно близкий эквивалент, хотя.
Линдес

14

Иногда есть вероятность, что сервер рельсов не будет закрыт должным образом. Вы можете найти процесс, используемый рельсами

PS Aux | grep rails

Выход будет как

user     12609  9.8  0.5  66456 45480 pts/0    Sl+  21:06   0:02 /home/user/.rvm/rubies/ruby-2.2.0-preview1/bin/ruby bin/rails s

Здесь process_id 12609 используется вашим сервером rails.

Вы можете легко убить его командой

убить -9 12609


Это стало для меня "ps aux | grep ruby". Может быть от перехода с вебрика на пуму
rigyt

Пожалуйста, смотрите мой комментарий о принятом ответе об использовании kill -9rote / привычно.
Линд

Я должен был сделать это, чтобы найти правильный процессps aux | grep puma
Сами Бирнбаум

11

Все ответы выше действительно хороши, но мне нужен был способ набрать как можно меньше в терминале, поэтому я создал для этого драгоценный камень. Вы можете установить гем только один раз и запускать команду «shutup» каждый раз, когда хотите уничтожить процесс Rails (находясь в текущей папке).

gem install shutup

затем перейдите в текущую папку вашего проекта rails и запустите

shutup # это убьет запущенный в данный момент Rails-процесс

Вы можете использовать команду «shutup» каждый раз, когда вы хотите

DICLAIMER: я создатель этого драгоценного камня

ПРИМЕЧАНИЕ: если вы используете rvm, установите гем глобально

rvm @global do gem install shutup

это аккуратно. Глядя на источник, ваш гем ищет файл pid, но он не гарантированно существует. lsofподход является более надежным.
Макс Pleaner

@maxpleaner: true, а также с большей вероятностью уничтожит какой-либо другой процесс, который может прослушивать этот порт, в случае, если это было сделано (возможно, случайно).
Линд

Это работает здесь. Если вы читаете это в 2019 году, пожалуйста, установите этот драгоценный камень, он действительно работает, намного проще ... просто запустите gem install shutup в своей папке, и каждый раз, когда вам нужно будет убить, просто наберите "shutup"
Guilherme Nunes

Я установил этот драгоценный камень, и запустил его, и он убил Синатру. Однако теперь порт 4567 по умолчанию не отвечает, как и любой другой порт, установленный командой set: port XXXX. Как я могу справиться с этим?
NevD


1

По умолчанию сервер rails использует порт 3000.
Таким образом, у вас есть 2 варианта запуска сервера rails.
1. Либо вы можете запустить сервер на другом порту, определив пользовательский порт с помощью следующей команды
rails s -p 3001
2. Или вы можете уничтожить все запущенные процессы ruby, выполнив следующую команду,
killall -9 ruby
затем запуститеrails server



-4

Введите:

man lsof

Затем найдите -w, -n и -i

-i: интернет-вещи -n: делает это быстрее -w: переключает предупреждения

ПУТЬ более подробно на страницах руководства


-6

Если вы находитесь на машине Windows, выполните следующие действия.

c:/project/
cd tmp
c:/project/tmp
cd pids
c:/project/tmp/pids
dir

Там у вас будет файл с именем server.pid

удали это.

c:/project/tmp/pid> del *.pid

Это оно.

РЕДАКТИРОВАТЬ: Пожалуйста, обратитесь это


3
Это не остановит сервер.
Нафаа Боутефер

Хотя этот код может помочь решить проблему, предоставляя дополнительный контекст относительно того, почему и / или как он отвечает на вопрос (в частности, почему вы считаете, что предложение для компьютера с Windows может быть полезным для вопроса, который утверждает, что он находится на MacOS) значительно улучшит его долгосрочную стоимость. Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение.
Тоби Спейт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.