El servidor Rails dice que el puerto ya se usó, ¿cómo matar ese proceso?


275

Estoy en una Mac, haciendo:

rails server

Yo obtengo:

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

Sé que puedo iniciar uno en un nuevo puerto, pero quiero matar este proceso.

Respuestas:


694

Suponiendo que está buscando matar lo que sea que esté en el puerto 3000 (que es lo que usualmente usa webrick), escriba esto en su terminal para averiguar el PID del proceso:

$ lsof -wni tcp:3000

Luego, use el número en la columna PID para matar el proceso:

$ kill -9 PID

44
¿podría explicar -wni
user993563

53
Solo para aclarar a los novatos: en la segunda línea de código, se supone que debe reemplazar el PIDnúmero real que se muestra en su consola al ingresar la primera línea de código (por ejemplo, 12345).
CodeBiker

55
También puede encontrar el PID navegando a través de su directorio de rieles hasta el siguiente archivo tmp / pids / server.pid
tandy

Esto puede suceder si está ejecutando el depurador en RubyMine y se bloquea o algo así ... El servidor se detiene pero el depurador continúa ... De todos modos, esta es la solución que utilicé y funciona perfectamente :)
J Smith

@tandy esta es una buena manera de obtener el PID para un proyecto específico, sin embargo, a veces cuando un proceso se cierra repentinamente, el archivo puede estar ausente pero el servidor aún puede estar ejecutándose. Haciendo una lsof -wni tcp:3000será siempre mostrar todos los procesos que escuchan en ese protocolo: combinación de puerto. (donde 3000 se debe reemplazar con el puerto del servidor local. Por ejemplo, en Rails, esto es 3000 por defecto).
SidOfc

125

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


3
todo entre paréntesis devolverá una identificación de proceso que usa el puerto 3000. Y -tsignifica 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).que supongo que sabes lo killque hará
Papouche Guinslyzinho

Esta debería ser la respuesta aceptada, ya que es una línea 'todo en uno'. Pon esto en un alias y listo.
Nubtacular

Si se incluyera una explicación, esto definitivamente valdría la pena.
mwfearnley

2
Esto eliminará todos los procesos, incluidas todas las sesiones de navegador abiertas. Así que debes tener cuidado cuando lo pruebes.
theterminalguy

1
Por favor, vea mi comentario sobre la respuesta aceptada sobre el uso kill -9por rutina / habitualmente.
lindes

29

Necesita obtener la identificación del proceso del programa usando el puerto tcp 3000. Para obtener la identificación del proceso

lsof -i tcp:3000 -t

Y luego, usando esa identificación de proceso, simplemente elimine el proceso con el comando ubuntu kill.

kill -9 pid

O simplemente ejecute el siguiente comando combinado. Primero buscará pid y luego matará ese proceso.

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

Por favor, vea mi comentario sobre la respuesta aceptada sobre el uso kill -9por rutina / habitualmente.
lindes

17

Para cualquiera que se encuentre con esta pregunta que no está en una Mac: suponiendo que sepa que su servidor se está ejecutando en el puerto 3000, puede hacer esto de una sola vez ejecutando lo siguiente:

fuser -k 3000/tcp

Pero como Toby ha mencionado, la implementación del fusor en Mac OS es bastante primitiva y este comando no funcionará en Mac.


1
Esto no funcionará en la Mac (Mac se estipuló en la pregunta) ya que el fusor solo acepta c, fyu como opciones.
Toby

He actualizado la respuesta y también aborda cómo usarla para usuarios de Mac. No hay ninguna razón para rechazar el voto, especialmente considerando a los demás, incluido yo mismo tropecé con esta pregunta en el pasado a pesar de no estar en una Mac.
saneshark

Agregar una -vbandera también muestra una pequeña cantidad de información sobre qué proceso se eliminó. Por lo tanto fuser -kv 3000/tcp. Por desgracia, el fusor de MacOS no tiene esta capacidad. kill $(lsof -ti tcp:3000)Sin embargo, es un equivalente bastante cercano.
lindes

14

Algunas veces existe la posibilidad de que el servidor de rails no se cierre correctamente. Puedes encontrar el proceso utilizado por los rieles

ps aux | rieles grep

La salida 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

Aquí process_id 12609 es utilizado por su servidor rails.

Puedes matarlo fácilmente por comando

matar -9 12609


Esto se ha convertido en "ps aux | grep ruby" para mí. Tal vez del cambio de webrick a puma
rigyt

Por favor, vea mi comentario sobre la respuesta aceptada sobre el uso kill -9por rutina / habitualmente.
lindes

Tuve que hacer esto para encontrar el proceso correctops aux | grep puma
Sami Birnbaum

11

Todas las respuestas anteriores son realmente buenas, pero necesitaba una forma de escribir lo menos posible en el terminal, así que creé una gema para eso. Puedes instalar la gema solo una vez y ejecutar el comando 'shutup' cada vez que quieras matar el proceso Rails (mientras estás en la carpeta actual).

gem install shutup

luego vaya a la carpeta actual de su proyecto rails y ejecute

shutup # esto matará el proceso de Rails que se está ejecutando actualmente

Puedes usar el comando 'shutup' cada vez que quieras

DICLAIMER: Soy el creador de esta gema.

NOTA: si está utilizando rvm, instale la gema globalmente

rvm @global do gem install shutup

Esto está bien. Mirando la fuente, su gema busca el archivo pid, pero no se garantiza que exista. El lsofenfoque es más confiable.
máximo demandante

@maxpleaner: verdadero, y también es más probable que elimine algún otro proceso que pueda estar escuchando en ese puerto, en caso de que se haya hecho (tal vez por accidente).
lindes

Funciona aqui. Si está leyendo esto en 2019, instale esta gema, realmente funciona, mucho más fácil ... simplemente ejecute el cierre de instalación de gemas en su carpeta, y cada vez que necesite matar simplemente escriba "shutup"
Guilherme Nunes

Instalé esta gema, la ejecuté y mató a Sinatra. Sin embargo, a partir de ahora el puerto predeterminado 4567 no responde, ni ningún otro puerto establecido por el comando 'set: port XXXX'. ¿Cómo puedo manejar esto?
NevD

2

ps aux | grep rails usa este comando puedes matar el servidor


1

De forma predeterminada, el servidor de rails usa el puerto 3000.
Por lo tanto, tiene 2 opciones para ejecutar el servidor de rails.
1. Puede ejecutar el servidor en otro puerto definiendo un puerto personalizado utilizando el siguiente comando
rails s -p 3001
2. O puede eliminar todo el proceso de ruby ​​ejecutando el siguiente comando y
killall -9 ruby
luego ejecutarrails server


0

Solución de una línea:

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

-4

Escribir:

man lsof

Luego busque -w, -n y -i

-i: material de Internet -n: lo hace más rápido -w: alterna las advertencias

Hay MUCHO más detalles en las páginas del manual


-6

Si está en una máquina con Windows, siga estos pasos.

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

Allí tendrá un archivo llamado server.pid

bórralo.

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

Eso es.

EDITAR: consulte esto


3
Esto no detendrá el servidor.
Nafaa Boutefer

Aunque este código puede ayudar a resolver el problema, proporciona un contexto adicional sobre por qué y / o cómo responde la pregunta (en particular, por qué cree que una sugerencia para una máquina con Windows podría ser útil para una pregunta que dice que está en MacOS) mejoraría significativamente su valor a largo plazo. Por favor, editar su respuesta a añadir un poco de explicación.
Toby Speight
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.