Сервер 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
idlefingers
источник
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)

Bijan
источник
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.

saneshark
источник
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

devudilip
источник
Это стало для меня "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
2

ps aux | grep rails используйте эту команду, чтобы убить сервер

коромысло
источник
1

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

Сарван Кумар
источник
0

Одноканальное решение:

kill -9 $(ps aux | grep 'rails s' | awk {'print$2'}); rails s
Анмол Чавла
источник
-4

Введите:

man lsof

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

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

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

InsanelyADHD
источник
-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) значительно улучшит его долгосрочную стоимость. Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение.
Тоби Спейт