Сервер 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, перейшовши через каталог рейлів до наступного файлу 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 -9за допомогою маршрутного / звичного.
lindes

29

Вам потрібно отримати ідентифікатор процесу програми, використовуючи порт tcp 3000. Щоб отримати ідентифікатор процесу

lsof -i tcp:3000 -t

А потім, використовуючи цей ідентифікатор процесу, просто вбити процес за допомогою команди ubuntu kill.

kill -9 pid

Або просто запустіть нижче згаданої команди комбінування. Він спочатку заробить Pid, ​​а потім знищить цей процес.

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

Будь ласка, дивіться мій коментар до прийнятої відповіді щодо використання kill -9за допомогою маршрутного / звичного.
lindes

17

Для всіх, хто натрапляє на це питання, що не на Mac: якщо ви знаєте, що ваш сервер працює на порту 3000, ви можете зробити це одним знімком, виконавши наступне:

fuser -k 3000/tcp

Але, як згадував Тобі, реалізація фюзера в Mac OS досить примітивна, і ця команда не працюватиме на mac.


1
Це не працюватиме на mac (Mac було визначено у запитанні), оскільки fuser приймає лише c, f та u як варіанти.
Тобі

Я оновив відповідь, і вона стосується того, як її використовувати і для користувачів Mac. Немає ніяких причин відмовлятись від голосування, особливо зважаючи на інших, в тому числі і я натрапив на це питання в минулому, незважаючи на те, що не був на мак.
saneshark

Додавання -vпрапора також показує невелику кількість інформації про те, який процес загинув. Отже fuser -kv 3000/tcp. На жаль, що термін MacOS не має такої можливості. kill $(lsof -ti tcp:3000)Хоча це досить близький еквівалент.
lindes

14

Іноді є ймовірність, що сервер перил не закриється належним чином. Ви можете знайти процес, використовуваний рейки

ps aux | грейпні рейки

Вихід буде подібний

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 використовується вашим сервером рейок.

Його можна легко вбити за командою

вбити -9 12609


Це стало для мене "ps aux | grep ruby". Можливо, з переходу від webrick на puma
rigyt

Будь ласка, дивіться мій коментар до прийнятої відповіді щодо використання kill -9за допомогою маршрутного / звичного.
lindes

Мені довелося це зробити, щоб знайти правильний процесps aux | grep puma
Самі Бірнбаум,

11

Усі відповіді вище справді хороші, але мені потрібен був спосіб набрати якомога менше терміналу, тому я створив дорогоцінний камінь для цього. Ви можете встановити дорогоцінний камінь лише один раз і запустити команду "закриття" щоразу, коли ви хочете вбити процес Rails (перебуваючи в поточній папці).

gem install shutup

потім перейдіть у поточну папку проекту рейлів та запустіть

shutup # це знищить поточний процес Rails

Ви можете використовувати команду "закриття" кожен раз, коли захочете

СЛУЧАЙНИК: Я творець цієї самоцвітки

ПРИМІТКА. Якщо ви використовуєте rvm, встановіть дорогоцінний камінь у всьому світі

rvm @global do gem install shutup

це акуратно. Дивлячись на джерело, ваш дорогоцінний камінь шукає файл pid, але це гарантовано не існує. lsofпідхід є більш надійним.
макс-чиститель

@maxpleaner: правда, а також більше шансів вбити якийсь інший процес, який, можливо, слухається на цьому порту, якщо це було зроблено (можливо, випадково).
lindes

Тут працює. Якщо ви читаєте це в 2019 році, будь ласка, встановіть цей дорогоцінний камінь, він дійсно працює, так що набагато простіше .. просто запустіть камеру встановлення закриття у вашій папці, і кожного разу, коли вам потрібно вбити, просто введіть "закриття"
Guilherme Nunes

Я встановив цей дорогоцінний камінь, запустив його, і він вбив Сінатру. Однак відтепер порт 4567 за замовчуванням не відповідає, ані будь-який інший порт, встановлений командою 'set: port XXXX'. Як я можу впоратися з цим?
НевД

2

ps aux | grep rails за допомогою цієї команди ви можете вбити сервер


1

За замовчуванням сервер рейлів використовує порт 3000.
Отже, у вас є 2 варіанти запуску сервера рейлів.
1. Або ви можете запустити сервер на іншому порту, визначивши спеціальний порт за допомогою наступної команди
rails s -p 3001
2. Або ви можете вбити весь запущений процес рубіну, виконавши наступну команду,
killall -9 ruby
а потім запустітьrails server



-4

Введіть:

man lsof

Тоді шукайте -w, -n та -i

-i: Інтернет-матеріали -n: прискорює швидкість -w: перемикає попередження

На сторінках man є більше деталей


-6

Якщо ви перебуваєте на машині Windows, виконайте ці дії.

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

Там ви отримаєте файл під назвою server.pid

видаліть його.

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

Це воно.

EDIT: Будь ласка, зверніться до цього


3
Це не зупинить сервер.
Нафаа Бутефер

Хоча цей код може допомогти вирішити проблему, надаючи додатковий контекст щодо того, чому та / або як він відповідає на це питання (зокрема, чому ви вважаєте, що пропозиція щодо машини Windows може бути корисною для запитання, в якому йдеться про те, що він знаходиться на MacOS) суттєво поліпшить його довгострокову вартість. Будь ласка , змініть свій відповідь , щоб додати деякі пояснення.
Toby Speight
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.