it-swarm-eu.dev

Quale processo è in ascolto su una determinata porta su Solaris?

Quindi accedo a una scatola di Solaris, provo ad avviare Apache e scopro che esiste già un processo in ascolto sulla porta 80 e non è Apache. Sulle nostre scatole non è installato lsof, quindi non posso interrogarlo. Immagino di poter fare:

pfiles `ls /proc` | less

e cerca "port: 80", ma se qualcuno ha una soluzione migliore, sono tutto orecchi! Ancora meglio se posso cercare il processo di ascolto senza essere root. Sono aperto a entrambe le soluzioni Shell e C; Non mi dispiacerebbe avere un piccolo eseguibile personalizzato da portare con me per la prossima volta che si presenta.

Aggiornato: sto parlando di installazioni generiche di Solaris per le quali non sono l'amministratore (anche se ho accesso da superutente), quindi l'installazione di cose dal disco freeware non è un'opzione. Ovviamente nessuno dei due utilizza estensioni specifiche di Linux per fuser, netstat o altri strumenti. Finora eseguire file su processi all sembra essere la soluzione migliore, sfortunatamente. Se il problema persiste, probabilmente posterò una risposta con un codice leggermente più efficiente della clip sopra.

Ho trovato questo copione da qualche parte. Non ricordo dove, ma funziona per 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

Modifica: ecco l'origine originale: [Solaris] Quale processo è associato a una determinata porta?

28
mavroprovato

Ecco un one-liner:

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

Il 'PID del processo di esame dell'eco' verrà stampato prima di ogni ricerca, quindi una volta che vedi un output che fa riferimento alla porta 80, saprai quale processo sta trattenendo l'handle.

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

Poiché ai "pfile" potrebbe non piacere che tu stia provando ad accedere ai processi di altri utenti, a meno che tu non sia ovviamente root.

8
Mauricio Morales

La risposta di Mavroprovato riporta più che solo le porte di ascolto. Le porte di ascolto sono prese senza peer. Il seguente programma Perl riporta solo le porte di ascolto. Funziona per me su 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

Da Solaris 11.2 in poi è possibile farlo con il comando netstat. Dai un'occhiata qui . Il -u switch è quello che stai cercando.

Se si utilizza una versione inferiore di Solaris, quindi - come altri hanno sottolineato - il modo di farlo di Solaris è una sorta di wrapper di script attorno al comando pfiles. Attenzione però che il comando pfiles arresta il processo per una frazione di secondo al fine di ispezionarlo. Per il 99,9% dei processi questo non è importante. Sfortunatamente abbiamo un processo che darà un dump core se viene colpito con un comando pfiles, quindi siamo un po 'cauti sull'uso del comando. La tua situazione potrebbe essere totalmente diversa se ti trovi nel 99,9%, il che significa che puoi tranquillamente utilizzare il comando pfiles.

3
peterh

netstat su Solaris non te lo dirà, né le versioni precedenti di lsof, ma se scarichi e crei/installi una versione più recente di lsof, questo può dirti.

$ 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: [email protected]
    compiler: gcc
    compiler version: 3.4.3 (csl-sol210-3_4-branch+sol_rpath)
    8<- - - - ***SNIP*** - - -

Con questo è possibile utilizzare l'opzione -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)

Il che ti mostra esattamente quello che stai chiedendo.

Ieri ho avuto un problema con un processo Jetty (Java) bloccato, che ha lasciato solo 2 file nella sua directory/proc/[PID] (psinfo e utilizzo).

pfiles non è riuscito a trovare il processo (perché la data di cui aveva bisogno non era lì)

l'ho trovato per me.

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

Potresti non volerlo, ma la cosa migliore da fare è prendere il CD di Sunfreeware e installare lsof.

A parte questo, sì, puoi aggirarti in/proc con uno script Shell.

1
wnoise

Molto probabilmente il server amministrativo di Sun .. Di solito è in bundle con la directory di Sun e alcune altre cose webmin-ish che si trovano nell'installazione predefinita

0
paan

Questo è un tipo di approccio indiretto, ma potresti vedere se un sito web si carica sul tuo browser Web preferito da qualsiasi cosa sia in esecuzione sulla porta 80. Oppure potresti telnet alla porta 80 e vedere se ottieni una risposta che ti dà un indizio come a ciò che è in esecuzione su quella porta e puoi spegnerlo. Poiché la porta 80 è la porta predefinita per le probabilità di traffico http, esiste una sorta di server http in esecuzione lì per impostazione predefinita, ma non esiste alcuna garanzia.

0
Greg Laws

Penso che la prima risposta sia la migliore che abbia scritto il mio script Shell sviluppando questa idea:

#!/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