Thursday, May 5, 2011

What process is listening on a certain port on Solaris?

So I log into a Solaris box, try to start Apache, and find that there is already a process listening on port 80, and it's not Apache. Our boxes don't have lsof installed, so I can't query with that. I guess I could do:

pfiles `ls /proc` | less

and look for "port: 80", but if anyone has a better solution, I'm all ears! Even better if I can look for the listening process without being root. I'm open to both shell and C solutions; I wouldn't mind having a little custom executable to carry with me for the next time this comes up.

Updated: I'm talking about generic installs of solaris for which I am not the administrator (although I do have superuser access), so installing things from the freeware disk isn't an option. Obviously neither are using Linux-specific extensions to fuser, netstat, or other tools. So far running pfiles on all processes seems to be the best solution, unfortunately. If that remains the case, I'll probably post an answer with some slightly more efficient code that the clip above.

From stackoverflow
  • If you have access to netstat, that can do precisely that.

    wnoise : Unfortunately it won't on solaris. You can use it to show all the open sockets, and their state, but not which process has them open.
  • Most probly sun's administrative server.. It's usually bundled along with sun's directory and a few other webmin-ish stuff that is in the default installation

  • Does your system has 'fuser' command?

    So you coud run following:

    fuser -n tcp 80
    
    Thevs : Agree. Seems to be like that.
  • You might not want to, but your best bet is to grab the sunfreeware CD and install lsof.

    Other than that, yes you can grovel around in /proc with a shell script.

  • Try running:

    netstat -a
    
  • This is sort of an indirect approach, but you could see if a website loads on your web browser of choice from whatever is running on port 80. Or you could telnet to port 80 and see if you get a response that gives you a clue as to what is running on that port and you can go shut it down. Since port 80 is the default port for http traffic chances are there is some sort of http server running there by default, but there's no guarantee.

  • I found this script somewhere. I don't remember where, but it works for me:

    #!/bin/ksh
    
    line='---------------------------------------------'
    pids=$(/usr/bin/ps -ef | sed 1d | awk '{print $2}')
    
    if [ $# -eq 0 ]; then
       read ans?"Enter port you would like to know pid for: "
    else
       ans=$1
    fi
    
    for f in $pids
    do
       /usr/proc/bin/pfiles $f 2>/dev/null | /usr/xpg4/bin/grep -q "port: $ans"
       if [ $? -eq 0 ]; then
          echo $line
          echo "Port: $ans is being used by PID:\c"
          /usr/bin/ps -ef -o pid -o args | egrep -v "grep|pfiles" | grep $f
       fi
    done
    exit 0
    

    Edit: Here is the original source: [Solaris] Which process is bound to a given port ?

0 comments:

Post a Comment