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에있는 것을 죽이려고한다고 가정하면 (웹릭이 일반적으로 사용하는 것) 터미널에 이것을 입력하여 프로세스의 PID를 찾으십시오.

$ lsof -wni tcp:3000

그런 다음 PID 열의 숫자를 사용하여 프로세스를 종료하십시오.

$ kill -9 PID

4
설명해 주 시겠습니까
— user993563

53
초보자를 명확히하기 위해 : 두 번째 코드 PID줄에서 첫 번째 코드 줄 (예 :)을 입력 할 때 콘솔에 표시되는 실제 숫자로를 바꾸어야합니다 12345.
— CodeBiker

5
rails 디렉토리를 통해 다음 파일로 이동하여 PID를 찾을 수도 있습니다. tmp /
— pids

RubyMine에서 디버거를 실행 중이거나 충돌이 발생하는 경우 이런 일이 발생할 수 있습니다. 서버가 중지되었지만 디버거가 계속됩니다 ... 어쨌든, 이것이 제가 사용한 솔루션이며 완벽하게 작동합니다. :)
— J Smith

@ tandy 이것은 특정 프로젝트에 대한 PID를 얻는 좋은 방법이지만 때로는 프로세스가 갑자기 닫히면 파일이 없지만 서버가 계속 실행될 수 있습니다. a lsof -wni tcp:3000를 수행하면 항상 해당 프로토콜 : 포트 조합에서 수신 대기하는 모든 프로세스가 표시 됩니다 . (3000은 로컬 서버 포트로 대체됩니다. 예를 들어 Rails에서는 기본적으로 3000입니다.)
— SidOfc 2016 년

125

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


3
괄호 사이에있는 모든 포트 3000과 사용하는 프로세스 ID를 반환합니다 -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 / habitually 사용에 대한 허용 된 답변에 대한 내 의견을 참조하십시오 .
— lindes

29

tcp port 3000을 사용하여 프로그램의 프로세스 ID를 가져와야합니다. 프로세스 ID를 얻으려면

lsof -i tcp:3000 -t

그런 다음 해당 프로세스 ID를 사용하여 ubuntu kill 명령을 사용하여 프로세스를 간단히 종료하십시오.

kill -9 pid

또는 아래에 언급 된 결합 명령을 실행하십시오. 먼저 pid를 가져온 다음 해당 프로세스를 종료합니다.

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

kill -9rote / habitually 사용에 대한 허용 된 답변에 대한 내 의견을 참조하십시오 .
— lindes

17

Mac에없는이 질문을 우연히 해결하려는 사람 : 서버가 포트 3000에서 실행되고 있다고 가정하면 다음을 실행하여 한 번에이 작업을 수행 할 수 있습니다.

fuser -k 3000/tcp

그러나 Toby가 언급했듯이 Mac OS에서 퓨저 구현은 다소 원시적이며이 명령은 Mac에서 작동하지 않습니다.


1
퓨저는 c, f 및 u 만 옵션으로 허용하므로 Mac에서는 작동하지 않습니다 (Mac은 질문에 명시되어 있음).
— Toby

답변을 업데이트했으며 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는 rails 서버에서 사용됩니다.

명령으로 쉽게 죽일 수 있습니다

죽이기 -9 12609


이것은 나를 위해 "ps aux | grep ruby"가되었습니다. 아마 webrick에서 puma
— 로의

kill -9rote / habitually 사용에 대한 허용 된 답변에 대한 내 의견을 참조하십시오 .
— lindes

나는 올바른 과정을 찾기 위해 이것을해야했다ps aux | grep puma
— Sami Birnbaum

11

위의 모든 답변은 실제로 훌륭하지만 터미널에 가능한 한 적게 입력하는 방법이 필요했기 때문에 보석을 만들었습니다. gem을 한 번만 설치하고 Rails 프로세스를 종료 할 때마다 (현재 폴더에있는 동안) 'shutup'명령을 실행할 수 있습니다.

gem install shutup

그런 다음 rails 프로젝트의 현재 폴더로 이동하여 실행하십시오.

shutup # 이것은 현재 실행중인 Rails 프로세스를 종료시킵니다

원할 때마다 'shutup'명령을 사용할 수 있습니다

점령 자 : 저는이 보석의 제작자입니다

참고 : rvm을 사용하는 경우 gem을 전체적으로 설치하십시오.

rvm @global do gem install shutup

깔끔하다. 소스를 살펴보면 gem이 pid 파일을 찾지 만 존재하지는 않습니다. lsof접근 방식은 더 신뢰할 수있다.
— max pleaner

@maxpleaner : true이며, 아마도 우연히 발생했을 경우 해당 포트에서 수신 대기중인 다른 프로세스를 중단시킬 가능성이 높습니다.
— lindes

여기에서 작동합니다. 2019 년에이 글을 읽고 있다면,이 gem을 설치하십시오. 실제로 작동합니다. 훨씬 더 쉽습니다. 폴더에서 gem install shutup을 실행하기 만하면 "shutup"유형을 죽일 때마다
— Guilherme Nunes

나는이 보석을 설치하고 달렸고 시나트라를 죽였다. 그러나 지금부터 기본 포트 4567이 응답하지 않거나 'set : port XXXX'명령으로 설정된 다른 포트도 없습니다. 어떻게 처리 할 수 ​​있습니까?
— NevD


1

기본적으로 Rails 서버는 포트 3000을 사용
합니다. 따라서 Rails 서버를 실행하는 두 가지 옵션이 있습니다.
1. 다음 명령을 사용하여 사용자 정의 포트를 정의하여 다른 포트에서 서버를 실행할 수 있습니다
rails s -p 3001
. 또는 다음 명령
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
서버가 중지되지는 않습니다.
— Nafaa Boutefer

이 코드는 문제를 해결하는 데 도움이 될 수 있지만 질문 에 왜 그리고 / 또는 어떻게 대답 하는지 에 대한 추가 컨텍스트를 제공 합니다 (특히 Windows 시스템에 대한 제안이 MacOS에 관한 질문에 유용 할 수 있다고 생각하는 이유) 장기적인 가치를 크게 향상시킬 것입니다. 제발 편집 약간의 설명을 추가 할 답변을.
— Toby Speight
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.