问题
As the title says, I'm running multiple game servers, and every of them has the same name
but different PID
and the port
number. I would like to match the PID
of the server which is listening on certain port, and then I would like to kill this process. I need that in order to complete my bash script.
Is that even possible? Because it didn't find yet any solutions on the web.
回答1:
The -p
flag of netstat
gives you PID of the process:
netstat -l -p
Edit: The command that is needed to get PIDs of socket users in FreeBSD is sockstat
.
As we worked out during the discussion with @Cyclone, the line that does the job is:
sockstat -4 -l | grep :80 | awk '{print $3}' | head -1
回答2:
Short version which you can pass to kill command:
lsof -i:80 -t
回答3:
netstat -p -l | grep $PORT
and lsof -i :$PORT
solutions are good but I prefer fuser $PORT/tcp
extension syntax to POSIX (which work for coreutils
) as with pipe:
pid=`fuser $PORT/tcp`
it prints pure pid so you can drop sed
magic out.
One thing that makes fuser
my lover tools is ability to send signal to that process directly (this syntax is also extension to POSIX):
$ fuser -k $port/tcp # with SIGKILL
$ fuser -k -15 $port/tcp # with SIGTERM
$ fuser -k -TERM $port/tcp # with SIGTERM
Also -k is supported by FreeBSD: http://www.freebsd.org/cgi/man.cgi?query=fuser
回答4:
netstat -nlp
should tell you the PID of what's listening on which port.
回答5:
I wanted to programmatically -- using only Bash -- kill the process listening on a given port.
Let's say the port is 8089, then here is how I did it:
badPid=$(netstat --listening --program --numeric --tcp | grep "::8089" | awk '{print $7}' | awk -F/ '{print $1}' | head -1)
kill -9 $badPid
I hope this helps someone else! I know it is going to help my team.
回答6:
Syntax:
kill -9 $(lsof -t -i:portnumber)
Example: To kill the process running at port 4200, run following command
kill -9 $(lsof -t -i:4200)
Tested in Ubuntu.
回答7:
Since sockstat wasn't natively installed on my machine I hacked up stanwise's answer to use netstat instead..
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""
回答8:
on windows, the netstat option to get the pid's is -o and -p selects a protocol filter, ex.: netstat -a -p tcp -o
来源:https://stackoverflow.com/questions/9856590/determine-the-process-pid-listening-on-a-certain-port