Какой процесс прослушивает определенный порт в Solaris? - PullRequest
28 голосов
/ 18 сентября 2008

Итак, я захожу в окно Solaris, пытаюсь запустить Apache и обнаруживаю, что процесс уже прослушивает порт 80, и это не Apache. На наших коробках не установлен lsof, поэтому я не могу сделать запрос. Я думаю, я мог бы сделать:

pfiles `ls /proc` | less

и ищите "порт: 80", но если у кого-то есть лучшее решение, я весь в ушах! Еще лучше, если я смогу искать процесс прослушивания, не будучи пользователем root. Я открыт как для оболочки, так и для C-решений; Я не возражаю, если у меня будет небольшой нестандартный исполняемый файл, который можно взять с собой в следующий раз.

Обновлено: я говорю об общих установках Solaris, для которых я не являюсь администратором (хотя у меня есть права суперпользователя), поэтому установка объектов с бесплатного диска не возможна. Очевидно, что ни один из них не использует специфичные для Linux расширения для fuser, netstat или других инструментов. Пока что, к сожалению, лучшим решением является запуск pfiles на всех процессах. Если это так, то я, вероятно, опубликую ответ с немного более эффективным кодом, как в приведенном выше ролике.

Ответы [ 11 ]

28 голосов
/ 05 мая 2009

Я где-то нашел этот скрипт. Я не помню где, но у меня это работает:

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

Редактировать: вот оригинальный источник: [Solaris] Какой процесс связан с данным портом?

8 голосов
/ 25 апреля 2013

Вот одна строка:

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

'PID процесса анализа эха' будет печататься перед каждым поиском, поэтому, как только вы увидите выходной ссылочный порт 80, вы узнаете, какой процесс удерживает дескриптор.

Альтернативное использование:
ps -ef| grep $USER|awk '{print $2}'| xargs -I '{}' sh -c 'echo examining process {}; pfiles {}| grep 80'

Поскольку pfiles может не понравиться, вы пытаетесь получить доступ к процессам других пользователей, если, конечно, вы не root.

4 голосов
/ 14 марта 2012

Ответ Мавропровато сообщает больше, чем только порты прослушивания. Порты прослушивания - это сокеты без однорангового узла. Следующая программа Perl сообщает только о прослушивающих портах. У меня работает на 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); }
3 голосов
/ 30 июня 2014

Начиная с Solaris 11.2, вы действительно можете делать это с помощью команды netstat. Взгляните здесь . Переключатель -u - это то, что вы ищете.

Если вы работаете с более низкой версией Solaris, то, как уже отмечали другие, способ Solaris - это своего рода оболочка сценария вокруг команды pfiles. Остерегайтесь, однако, что команда pfiles останавливает процесс на долю секунды, чтобы проверить его. Для 99,9% процессов это неважно. К сожалению, у нас есть процесс, который выдаст дамп ядра, если на него попадет команда pfiles, поэтому мы немного осторожнее с этой командой. Ваша ситуация может быть совершенно другой, если вы находитесь на 99,9%, то есть вы можете безопасно использовать команду pfiles.

2 голосов
/ 19 июня 2014

netstat в Solaris не скажет вам этого, равно как и более старые версии lsof, но если вы загрузите и соберете / установите более новую версию lsof, это может сказать вам об этом.

$ 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*** - - -

С этим вы можете использовать опцию -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)

Который показывает вам именно то, что вы просите.

Вчера у меня возникла проблема с аварийным процессом Jetty (Java), который оставил только 2 файла в своем каталоге / proc / [PID] (psinfo & using).

pfiles не удалось найти процесс (потому что нужной даты там не было)

Я нашел его для меня.

2 голосов
/ 07 октября 2013
#!/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}"
1 голос
/ 23 сентября 2008

Возможно, вы не захотите, но лучше всего взять компакт-диск с бесплатными программами и установить lsof.

Кроме этого, да, вы можете разбираться в / proc с помощью сценария оболочки.

0 голосов
/ 03 сентября 2013

Я думаю, что первый ответ является лучшим Я написал свой собственный скрипт оболочки, развивая эту идею:

#!/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 голосов
/ 08 октября 2008

Это своего рода косвенный подход, но вы можете увидеть, загружается ли веб-сайт в выбранный вами веб-браузер из того, что работает на порту 80. Или вы можете подключиться к порту 80 по telnet и посмотреть, получите ли вы ответ, который дает вам подсказка о том, что работает на этом порту, и вы можете отключить его. Поскольку порт 80 является портом по умолчанию для шансов http-трафика, там по умолчанию работает какой-то http-сервер, но нет гарантии.

0 голосов
/ 18 сентября 2008

Наиболее вероятный административный сервер Sun .. Обычно он поставляется вместе с каталогом sun и некоторыми другими компонентами webmin-ish, установленными по умолчанию

...