Сервер 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.