Determine o processo pid escutando em uma determinada porta


101

Como o título diz, estou executando vários servidores de jogo, e cada um deles tem o mesmo, namemas diferente PIDe o portnúmero. Eu gostaria de combinar o PIDdo servidor que está escutando em determinada porta, e então gostaria de encerrar esse processo. Eu preciso disso para completar meu script bash.

É mesmo possível? Porque ainda não encontrou soluções na web.

Respostas:


125

A -pbandeira de netstatfornece o PID do processo:

netstat -l -p

Edit: O comando que é necessário para obter os PIDs dos usuários de socket no FreeBSD é sockstat. Como trabalhamos durante a discussão com @Cyclone, a linha que faz o trabalho é:

sockstat -4 -l | grep :80 | awk '{print $3}' | head -1

2
netstat: 80: unknown or uninstrumented protocolusou a 80porta (nginx) para fins de teste. Não funcionou.
Ciclone

5
tente em netstat -nlp | grep :80vez disso
normalmente,

12
netstat: option requires an argument -- p
Ciclone

2
@jasonbrittain No Cygwin, o Windows Native netstaté chamado. Possui outra sintaxe.
stanwise de

2
esta resposta está errada: netstat: a opção requer um argumento - p
Boa pessoa

143

Versão curta que você pode passar para o comando kill:

lsof -i:80 -t

13
Isso também inclui processos que estão conectados nessa porta. lsof -i4TCP:80 -sTCP:LISTEN -té provavelmente o que você deseja.
Nevir

Exatamente o que eu estava procurando. Eu queria matar um processo procurando a porta em que ele está sendo executado.
codificador mítico

@Nevir o que você quer dizer com "também inclui processos conectados nessa porta"? Você pode explicar, por favor?
kishorer747

2
kill -9 `lsof -i:80 -t`para facilidade de cópia
bmjrowe

17

netstat -p -l | grep $PORTe as lsof -i :$PORT soluções são boas, mas eu prefiro fuser $PORT/tcpsintaxe de extensão para POSIX (que funciona para coreutils) como com pipe:

pid=`fuser $PORT/tcp`

ele imprime puro pid para que você possa eliminar a sedmagia.

Uma coisa que torna fusermeu amante ferramentas é a capacidade de enviar sinais para esse processo diretamente (esta sintaxe também é uma extensão para POSIX):

$ fuser -k $port/tcp       # with SIGKILL
$ fuser -k -15 $port/tcp   # with SIGTERM
$ fuser -k -TERM $port/tcp # with SIGTERM

Além disso, -k é suportado pelo FreeBSD: http://www.freebsd.org/cgi/man.cgi?query=fuser


1
fuser us mais puro e conciso
Dawoodjee

10

netstat -nlp deve informar o PID do que está escutando em qual porta.


1
netstat: 80: unknown or uninstrumented protocolusou a 80porta (nginx) para fins de teste. Não funcionou.
Ciclone

3

Como o sockstat não foi instalado nativamente em minha máquina, eu criei a resposta do stanwise para usar o netstat em seu lugar.

netstat -nlp | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:2000" | awk '{print $7}' | sed -e "s/\/.*//g""

3

Eu queria programaticamente - usando apenas o Bash - eliminar o processo de escuta em uma determinada porta.

Digamos que a porta seja 8089, então aqui está como eu fiz:

badPid=$(netstat --listening --program --numeric --tcp | grep "::8089" | awk '{print $7}' | awk -F/ '{print $1}' | head -1)
kill -9 $badPid

Espero que isto ajude alguém! Eu sei que vai ajudar minha equipe.


1
Aqui está a função que uso para fazer isso: function kill-listener { lsof -i:$1 -t | xargs kill -9 }Usando seu exemplo de porta 8089:kill-listener 8089
Furacão Hamilton

3

Sintaxe:

kill -9 $ (lsof -t -i: portnumber)

Exemplo: para encerrar o processo em execução na porta 4200, execute o seguinte comando

kill -9 $(lsof -t -i:4200)

Testado no Ubuntu.


2

no windows, a opção netstat para obter o pid é -o e -p seleciona um filtro de protocolo, ex .: netstat -a -p tcp -o

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.