Servidor Rails diz porta já usada, como matar esse processo?

275

Estou no mac, fazendo:

rails server

Eu recebo:

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

Eu sei que posso iniciar um em uma nova porta, mas quero matar esse processo.

Blankman
fonte

Respostas:

694

Supondo que você esteja procurando matar o que quer que esteja na porta 3000 (que é normalmente usada pela webrick), digite isso no seu terminal para descobrir o PID do processo:

$ lsof -wni tcp:3000

Em seguida, use o número na coluna PID para interromper o processo:

$ kill -9 PID
idlefingers
fonte
4
você poderia, por favor, explicar -wni
user993563
53
Apenas para esclarecer para iniciantes: na segunda linha de código, você deve substituir o PIDnúmero real que é mostrado em seu console ao inserir a primeira linha de código (por exemplo, 12345).
CodeBiker
5
Você também pode encontrar o PID navegando no diretório rails para o seguinte arquivo tmp / pids / server.pid
tandy
Isso pode acontecer se você estiver executando depurador no RubyMine e ele trava ou algo assim ... O servidor pára, mas o depurador continua ... De qualquer forma, esta é a solução que eu usei e ele funciona perfeitamente :)
J Smith
@tandy, essa é uma boa maneira de obter o PID para um projeto específico, no entanto, às vezes, quando um processo é fechado repentinamente, o arquivo pode estar ausente, mas o servidor ainda pode estar em execução. Fazendo um lsof -wni tcp:3000vai sempre mostrar todos os processos escutando esse protocolo: combinação de porta. (onde 3000 deve ser substituído pela porta do servidor local. por exemplo, no Rails, isso é 3000 por padrão).
SidOfc 13/06/19
125

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

Bijan
fonte
3
tudo entre os parênteses retornará um ID de processo que usando a porta 3000. E -tatravés 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).do que eu acho que você sabe o que killvai fazer
Papouche Guinslyzinho
Essa deve ser a resposta aceita, pois é uma linha "tudo em um". Coloque isso em um pseudônimo e você estará pronto.
Nubtacular
Se uma explicação fosse incluída, isso definitivamente valeria a pena.
Mkfearnley # 19/16
2
Isso matará todos os processos, incluindo todas as sessões do navegador abertas. Então você quer ter cuidado ao experimentar.
Theterminalguy
1
Por favor, veja meu comentário sobre a resposta aceita sobre o uso kill -9por rotina / habitualmente.
Lindes
29

Você precisa obter o ID do processo do programa usando a porta tcp 3000. Para obter o ID do processo

lsof -i tcp:3000 -t

E então, usando o ID do processo, simplesmente mate o processo usando o comando ubuntu kill.

kill -9 pid

Ou apenas execute o comando combinado mencionado abaixo. Primeiro ele buscará o pid e depois matará esse processo.

kill -9 $(lsof -i tcp:3000 -t)
Shahzad Tariq
fonte
Por favor, veja meu comentário sobre a resposta aceita sobre o uso kill -9por rotina / habitualmente.
Lindes
17

Para quem se deparar com essa pergunta que não está em um Mac: supondo que você saiba que seu servidor está executando na porta 3000, você pode fazer isso de uma só vez executando o seguinte:

fuser -k 3000/tcp

Mas, como Toby mencionou, a implementação do fusor no Mac OS é bastante primitiva e esse comando não funcionará no mac.

Saneshark
fonte
1
Isso não funcionará no mac (o Mac foi estipulado na pergunta), pois o fusor aceita apenas c, f e u como opções.
Toby
Atualizei a resposta e aborda como usá-lo também para usuários de mac. Não há motivo para votar em baixa, especialmente considerando os outros, inclusive eu me deparei com essa questão no passado, apesar de não estar em um Mac.
Saneshark #
Adicionar um -vsinalizador também mostra uma pequena quantidade de informações sobre qual processo foi morto. Então fuser -kv 3000/tcp. Infelizmente, o fusor do MacOS não tem essa capacidade. kill $(lsof -ti tcp:3000)é um equivalente bastante próximo, no entanto.
Lindes
14

Algumas vezes há uma chance de o servidor Rails não ser fechado corretamente. Você pode encontrar o processo usado pelos trilhos

ps aux | trilhos grep

A saída será como

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

Aqui process_id 12609 é usado pelo seu servidor rails.

Você pode matá-lo facilmente por comando

kill -9 12609

devudilip
fonte
Isso se tornou "ps aux | grep ruby" para mim. Talvez da mudança de webrick para puma
#
Por favor, veja meu comentário sobre a resposta aceita sobre o uso kill -9por rotina / habitualmente.
Lindes
Eu tive que fazer isso para encontrar o processo certops aux | grep puma
Sami Birnbaum
11

Todas as respostas acima são realmente boas, mas eu precisava de uma maneira de digitar o mínimo possível no terminal, então criei uma gema para isso. Você pode instalar o gem apenas uma vez e executar o comando 'shutup' toda vez que quiser interromper o processo do Rails (enquanto estiver na pasta atual).

gem install shutup

então vá na pasta atual do seu projeto rails e execute

shutup # isso matará o processo Rails atualmente em execução

Você pode usar o comando 'shutup' toda vez que quiser

DICLAIMER: Eu sou o criador desta gema

NOTA: se você estiver usando o rvm, instale a gema globalmente

rvm @global do gem install shutup
Lorenzo Sinisi
fonte
isso é legal. Olhando a fonte, sua jóia procura o arquivo pid, mas não há garantia de que ela exista. a lsofabordagem é mais confiável.
Pleaner max
@ maxpleaner: true, e também é mais provável que mate algum outro processo que possa estar ouvindo nessa porta, caso isso tenha sido feito (talvez por acidente).
Lindes
Funciona aqui. Se você está lendo isso em 2019, instale esta jóia, ele realmente funciona, muito mais fácil .. gem apenas correr instalar shutup na sua pasta, e toda vez que você precisa matar basta digitar "shutup"
Guilherme Nunes
Instalei esta gema, executei-a e matou Sinatra. No entanto, a partir de agora a porta padrão 4567 não responde, nem nenhuma outra porta definida pelo comando 'set: port XXXX'. Como posso lidar com isso?
NevD 5/11/19
2

ps aux | grep rails use este comando, você pode matar o servidor

Rocker
fonte
1

Por padrão, o servidor rails usa a porta 3000.
Portanto, você tem 2 opções para executar o servidor rails.
1. Você pode executar o servidor em outra porta, definindo a porta personalizada usando o seguinte comando
rails s -p 3001
2. Ou você pode eliminar todo o processo em execução do ruby ​​executando o seguinte comando e, em
killall -9 ruby
seguida, executerails server

Sarwan Kumar
fonte
0

Solução de uma linha:

kill -9 $(ps aux | grep 'rails s' | awk {'print$2'}); rails s
Anmol Chawla
fonte
-4

Digitar:

man lsof

Em seguida, procure -w, -n e -i

-i: coisas na internet -n: torna mais rápido -w: alterna avisos

Há MUITO MAIS detalhes nas páginas de manual

InsanelyADHD
fonte
-6

Se você estiver na máquina Windows, siga estas etapas.

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

Lá você encontrará um arquivo chamado server.pid

delete isso.

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

É isso aí.

EDIT: Consulte este

Prabhakar Undurthi
fonte
3
Isso não irá parar o servidor.
Nafaa Boutefer
Embora esse código possa ser útil para solucionar o problema, fornecendo um contexto adicional sobre o porquê e / ou como ele responde à pergunta (em particular, por que você acha que uma sugestão para uma máquina Windows pode ser útil para uma pergunta que afirma que está no MacOS) melhoraria significativamente o seu valor a longo prazo. Por favor edite sua resposta para adicionar alguma explicação.
Toby Speight