Getting PID from lsof list

12,776

Solution 1

I think your whole approach is flawed, you should probably run your service under systemd (or wrap it in a systemV style start-stop script that records the PID) which would simplify stopping the correct service greatly.

Alternatively the conventional tool to find a specific process is pgrep and the associated pkill allows you to easily kill them:

pkill -9 -u node  react-native-app-name

Having said that, to answer your literal question: in general the correct service processes to stop are the ones which provide the listener on that TCP port, i.e. restrict your lsof output with -sTCP:LISTEN

lsof -i :8081 -sTCP:LISTEN |awk 'NR > 1 {print $2}'  |xargs kill -15

Solution 2

lsof -i :8081 | awk '{system("kill -9 " $2)}'

should do what you want. Be careful on a very high load system with a lot of short lived processes though. It could be that you kill the wrong process because sometimes the output of lsof proved not to be too reliable over time.

Solution 3

Was going through this post. There are several ways suggested here to kill the process pulled using lsof.

Easiest way to kill -

kill $(lsof -ti:PORT)

This will kill all the process ids fetched in loop, automatically.

Share:
12,776

Related videos on Youtube

PumpkinSeed
Author by

PumpkinSeed

Updated on September 18, 2022

Comments

  • PumpkinSeed
    PumpkinSeed over 1 year

    I have a react-native application and I want to write a script for start test version. I need to shotdown the :8081 port if it is alive. The command:

    lsof -i :8081
    kill -9 <PID>
    

    The lsof getting back this result:

        COMMAND     PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
    chrome     2423 loow  127u  IPv4 13749099      0t0  TCP localhost.localdomain:36650->localhost.localdomain:tproxy (ESTABLISHED)
    qemu-syst 15091 loow   64u  IPv4 13795587      0t0  TCP localhost.localdomain:43518->localhost.localdomain:tproxy (ESTABLISHED)
    qemu-syst 15091 loow   66u  IPv4 13795588      0t0  TCP localhost.localdomain:43520->localhost.localdomain:tproxy (ESTABLISHED)
    qemu-syst 15091 loow   89u  IPv4 13777485      0t0  TCP localhost.localdomain:40500->localhost.localdomain:tproxy (ESTABLISHED)
    node      16210 loow   16u  IPv6 13747716      0t0  TCP *:tproxy (LISTEN)
    node      16210 loow   18u  IPv6 13751322      0t0  TCP localhost.localdomain:tproxy->localhost.localdomain:36650 (ESTABLISHED)
    node      16210 loow   19u  IPv6 13798473      0t0  TCP localhost.localdomain:tproxy->localhost.localdomain:43518 (ESTABLISHED)
    node      16210 loow   21u  IPv6 13798475      0t0  TCP localhost.localdomain:tproxy->localhost.localdomain:43520 (ESTABLISHED)
    node      16210 loow   27u  IPv6 13777958      0t0  TCP localhost.localdomain:tproxy->localhost.localdomain:40500 (ESTABLISHED)
    

    What exactly I need is the pid of the node service in this case 16210. How can I get it from lsof?

    I tryed lsof -ti :8081 which return only the pids, but it's return back all of it. I tryed to extend it with grep: lsof -ti :8081 | grep node, which return nothing.

    So I only need the process id, to take it into the kill -9 $PID.

    • Admin
      Admin over 2 years
      Nobody has mentioned in the answers, but using -9 (SIGKILL) may not be the best idea, as it denies the process any opportunity to do cleanup and release resources. Use -15 (SIGTERM) first, give the process some time to exit on its own, and if it still hasn't exited then do the SIGKILL.
  • PumpkinSeed
    PumpkinSeed almost 7 years
    Im sure that it's better under systemd, but this is just test, so I just write a script which start the test version of the app. But yes you answered my question thank you.
  • PumpkinSeed
    PumpkinSeed almost 7 years
    Because of the these short lived process I wanted to setup the name of the process as "node", because only one service can run as node module on the same port.
  • Admin
    Admin almost 2 years
    Nice! This is WAY simpler.