Какой процесс прослушивает определенный порт в Solaris?
Поэтому я захожу в окно Solaris, пытаюсь запустить Apache и обнаруживаю, что процесс уже прослушивает порт 80, и это не Apache. На наших коробках не установлен lsof, поэтому я не могу сделать запрос. Я думаю, я мог бы сделать:
pfiles `ls /proc` | less
и искать "порт: 80", но если у кого-то есть лучшее решение, я все уши! Еще лучше, если я смогу искать процесс прослушивания, не будучи пользователем root. Я открыт как для оболочки, так и для C-решений; Я не возражал бы иметь небольшой нестандартный исполняемый файл, который можно взять с собой в следующий раз.
Обновлено: я говорю об общих установках Solaris, для которых я не являюсь администратором (хотя у меня есть права суперпользователя), поэтому установка объектов с бесплатного диска не возможна. Очевидно, что ни один из них не использует специфичные для Linux расширения для fuser, netstat или других инструментов. К сожалению, пока что запуск pfiles на всех процессах, кажется, является лучшим решением. Если это так, я, вероятно, опубликую ответ с немного более эффективным кодом, как в приведенном выше ролике.
12 ответов
Я нашел этот скрипт где-то. Я не помню где, но у меня это работает:
#!/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] Какой процесс связан с данным портом?
Вот одна строка:
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.
Ответ Мавропровато сообщает не только о прослушивающих портах. Слушающие порты - это сокеты без пира. Следующая программа 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); }
Начиная с версии Solaris 11.2 вы можете сделать это с помощью netstat
команда. Посмотрите здесь. -u
переключатель это то, что вы ищете.
Если вы работаете с более низкой версией Solaris, то, как уже отмечали другие, способ Solaris - это своего рода оболочка для скриптов вокруг pfiles
команда. Осторожно, хотя это pfiles
Команда останавливает процесс на долю секунды, чтобы проверить его. Для 99,9% процессов это неважно. К сожалению, у нас есть процесс, который даст дамп ядра, если на него ударит pfiles
команда, поэтому мы немного осторожны с использованием команды. Ваша ситуация может быть совершенно другой, если вы находитесь в 99,9%, то есть вы можете безопасно использовать pfiles
команда.
#!/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}"
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 не смог найти процесс (потому что нужной ему даты там не было)
Я нашел это для меня.
Возможно, вы этого не захотите, но лучше всего взять компакт-диск с бесплатными программами и установить lsof.
Кроме этого, да, вы можете обходиться в /proc с помощью сценария оболочки.
Я думаю, что первый ответ - лучший, я написал свой собственный скрипт оболочки, развивая эту идею:
#!/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
используя приведенный ниже скрипт для определения номера порта и идентификатора соответствующего процесса:
# sh port_scan_pid.sh 22
#!/bin/bash
Hostnames=`uname -n | cut -d. -f1`
port=$1
OS=`uname -s`
printf "+---------------+--------+-------+-----------+----------------------------------+\n"
printf "| %-13s | %-6s | %-5s | %-9s | %-32s |\n" "HostName" "PID" "PORT" "USER" "COMMAND"
printf "+---------------+--------+-------+-----------+----------------------------------+\n"
for Process_id in `ls /proc`
do
pfiles $Process_id 2>/dev/null | grep AF_INET | grep -w "$port" > /dev/null 2>&1
if [ $? -eq 0 ]; then
prid_user=`ps -o user -p $Process_id | tr -d ' '| tail -1`
prid_command=`ps -o comm -p $Process_id | tr -d ' '| tail -1`
printf "| %-13s | %-6s | %-5s | %-9s | %-32s |\n" "$Hostnames" "$Process_id" "$port" "$prid_user" "$prid_command"
else
echo "$Hostnames | $OS | $port no PID found" > /dev/null 2>&1
fi
done
printf "+---------------+--------+-------+-----------+----------------------------------+\n"
Выход:
root@NODE1:~# sh port_scan_pid.sh 22
+----------+--------+-------+-------+
| HostName | PID | PORT | OS |
+----------+--------+-------+-------+
| NODE1 | 25065 | 22 | SunOS |
| NODE1 | 25068 | 22 | SunOS |
| NODE1 | 693 | 22 | SunOS |
+----------+--------+-------+-------+
Это своего рода косвенный подход, но вы можете увидеть, загружается ли веб-сайт в выбранный вами веб-браузер из того, что работает на порту 80. Или вы можете подключиться к порту 80 через telnet и посмотреть, получите ли вы ответ, который дает подсказку, как к тому, что работает на этом порту, и вы можете отключить его. Так как порт 80 является портом по умолчанию для шансов http-трафика, там по умолчанию работает какой-то http-сервер, но нет никакой гарантии.
Скорее всего, административный сервер Sun. Обычно он поставляется вместе с каталогом Sun и несколькими другими компонентами webmin-ish, которые находятся в установке по умолчанию.
Если у вас есть доступ к netstat
, что может сделать именно это.