web-dev-qa-db-fra.com

Quel processus écoute sur un certain port de Solaris?

Je me connecte donc à une boîte Solaris, j'essaie de démarrer Apache et je constate qu'il existe déjà un processus d'écoute sur le port 80, et ce n'est pas Apache. Nos boîtes n'ont pas lsof installé, donc je ne peux pas interroger avec ça. Je suppose que je pourrais faire:

pfiles `ls /proc` | less

et cherchez "port: 80", mais si quelqu'un a une meilleure solution, je suis à l'écoute! Encore mieux si je peux rechercher le processus d'écoute sans être root. Je suis ouvert aux solutions Shell et C; Cela ne me dérangerait pas d'avoir un petit exécutable personnalisé à emporter avec moi pour la prochaine fois.

Mise à jour: je parle d'installations génériques de solaris pour lesquelles je ne suis pas l'administrateur (bien que j'aie un accès superutilisateur), donc installer des choses à partir du disque du freeware n'est pas une option. De toute évidence, ni l'un ni l'autre n'utilisent d'extensions spécifiques à Linux pour l'unité de fusion, netstat ou d'autres outils. Jusqu'à présent, l'exécution de pfiles sur tous processus semble malheureusement être la meilleure solution. Si cela reste le cas, je posterai probablement une réponse avec un code légèrement plus efficace que le clip ci-dessus.

J'ai trouvé ce script quelque part. Je ne me souviens pas où, mais cela fonctionne pour moi:

#!/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: Voici la source d'origine: [Solaris] Quel processus est lié à un port donné?

28
mavroprovato

Voici une ligne:

ps -ef| awk '{print $2}'| xargs -I '{}' sh -c 'echo examining process {}; pfiles {}| grep 80'

'echo examining process PID' sera imprimé avant chaque recherche, donc une fois que vous verrez une sortie référençant le port 80, vous saurez quel processus tient la poignée.

ps -ef| grep $USER|awk '{print $2}'| xargs -I '{}' sh -c 'echo examining process {}; pfiles {}| grep 80'

Étant donné que 'pfiles' peut ne pas aimer cela, vous essayez d'accéder aux processus d'autres utilisateurs, sauf si vous êtes root, bien sûr.

8
Mauricio Morales

La réponse de Mavroprovato rapporte plus que seulement les ports d'écoute. Les ports d'écoute sont des sockets sans homologue. Le programme Perl suivant ne signale que les ports d'écoute. Cela fonctionne pour moi sur SunOS 5.10.

#! /usr/bin/env Perl
##
## Search the processes which are listening on the given port.
##
## For SunOS 5.10.
##

use strict;
use warnings;

die "Port missing" unless $#ARGV >= 0;
my $port = int($ARGV[0]);
die "Invalid port" unless $port > 0;

my @pids;
map { Push @pids, $_ if $_ > 0; } map { int($_) } `ls /proc`;

foreach my $pid (@pids) {
    open (PF, "pfiles $pid 2>/dev/null |") 
        || warn "Can not read pfiles $pid";
    $_ = <PF>;
    my $fd;
    my $type;
    my $sockname;
    my $peername;
    my $report = sub {
        if (defined $fd) {
            if (defined $sockname && ! defined $peername) {
                print "$pid $type $sockname\n"; } } };
    while (<PF>) {
        if (/^\s*(\d+):.*$/) {
            &$report();
            $fd = int ($1);
            undef $type;
            undef $sockname;
            undef $peername; }
        elsif (/(SOCK_DGRAM|SOCK_STREAM)/) { $type = $1; }
        elsif (/sockname: AF_INET[6]? (.*)  port: $port/) {
            $sockname = $1; }
        elsif (/peername: AF_INET/) { $peername = 1; } }
    &$report();
    close (PF); }
4
ceving

À partir de Solaris 11.2, vous pouvez en effet le faire avec la commande netstat. Jetez un oeil ici . Le -u switch est ce que vous recherchez.

Si vous utilisez une version inférieure de Solaris, alors - comme d'autres l'ont souligné - la façon de procéder de Solaris est une sorte de wrapper de script autour de la commande pfiles. Attention cependant que la commande pfiles arrête le processus pendant une fraction de seconde afin de l'inspecter. Pour 99,9% des processus, cela n'a pas d'importance. Malheureusement, nous avons un processus qui donnera un vidage de mémoire s'il est frappé avec une commande pfiles donc nous sommes un peu prudents quant à l'utilisation de la commande. Votre situation peut être totalement différente si vous êtes dans le 99,9%, ce qui signifie que vous pouvez utiliser en toute sécurité la commande pfiles.

3
peterh

netstat sur Solaris ne vous le dira pas, pas plus que les anciennes versions de lsof, mais si vous téléchargez et construisez/installez une version plus récente de lsof, cela peut vous le dire.

$ lsof -v
lsof version information:
    revision: 4.85
    latest revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
    latest FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
    latest man page: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
    configuration info: 64 bit kernel
    constructed: Fri Mar 7 10:32:54 GMT 2014
    constructed by and on: user@hostname
    compiler: gcc
    compiler version: 3.4.3 (csl-sol210-3_4-branch+sol_rpath)
    8<- - - - ***SNIP*** - - -

Avec cela, vous pouvez utiliser l'option -i:

$ lsof -i:22
COMMAND   PID     USER   FD   TYPE             DEVICE   SIZE/OFF NODE NAME
sshd      521     root    3u  IPv6 0xffffffff89c67580        0t0  TCP *:ssh (LISTEN)
sshd     5090     root    3u  IPv6 0xffffffffa8668580   0t322598  TCP Host.domain.com:ssh->21.43.65.87:52364 (ESTABLISHED)
sshd     5091   johngh    4u  IPv6 0xffffffffa8668580   0t322598  TCP Host.domain.com:ssh->21.43.65.87:52364 (ESTABLISHED)

Ce qui vous montre exactement ce que vous demandez.

J'ai eu un problème hier avec un processus Jetty (Java) bloqué, qui n'a laissé que 2 fichiers dans son répertoire/proc/[PID] (psinfo & usage).

pfiles n'a pas trouvé le processus (car la date dont il avait besoin n'était pas là)

lsof l'a trouvé pour moi.

2
JohnGH
#!/usr/bin/bash
# This is a little script based on the "pfiles" solution that prints the PID and PORT.

pfiles `ls /proc` 2>/dev/null | awk "/^[^ \\t]/{smatch=\$0;next}/port:[ \\t]*${1}/{print smatch, \$0}{next}"
2
Malcolm Boekhoff

Vous ne le voudrez peut-être pas, mais votre meilleur pari est de saisir le CD sunfreeware et d'installer lsof.

En dehors de cela, oui, vous pouvez vous déplacer dans/proc avec un script Shell.

1
wnoise

Le serveur d'administration de Sun le plus problématique .. Il est généralement fourni avec le répertoire de Sun et quelques autres trucs webmin qui sont dans l'installation par défaut

0
paan

Il s'agit en quelque sorte d'une approche indirecte, mais vous pouvez voir si un site Web se charge sur le navigateur Web de votre choix à partir de ce qui s'exécute sur le port 80. Ou vous pouvez telnet sur le port 80 et voir si vous obtenez une réponse qui vous donne un indice à ce qui fonctionne sur ce port et vous pouvez l'arrêter. Étant donné que le port 80 est le port par défaut pour le trafic http, il existe une sorte de serveur http qui y fonctionne par défaut, mais il n'y a aucune garantie.

0
Greg Laws

Je pense que la première réponse est la meilleure que j'ai écrite mon propre script Shell en développant cette idée:

#!/bin/sh
if [ $# -ne 1 ]
then
    echo "Sintaxis:\n\t"
    echo " $0 {port to search in process }"
    exit
else
    MYPORT=$1
    for i in `ls /proc`
    do

       pfiles $i | grep port | grep "port: $MYPORT" > /dev/null
       if [ $? -eq 0 ]
         then
           echo " Port $MYPORT founded in $i proccess !!!\n\n"
           echo "Details\n\t"
           pfiles $i | grep port | grep "port: $MYPORT"
           echo "\n\t"
           echo "Process detail: \n\t"
           ps -ef | grep $i  | grep -v grep
       fi
    done
fi
0
RomAndNonES