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.

Ciclone
fonte

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
normalmente
fonte
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
Laurynas
fonte
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

Gavenkoa
fonte
1
fuser us mais puro e conciso
Dawoodjee
10

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


fonte
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""
dafky2000
fonte
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.

Glavin001
fonte
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.

Debashish Sen
fonte
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

Jan Wilmans
fonte