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.