web-dev-qa-db-ja.com

Solarisの特定のポートでどのプロセスがリッスンしていますか?

そこで、Solarisボックスにログインし、Apacheを起動して、ポート80でリッスンしているプロセスが既に存在することを確認します。これはApacheではありません。ボックスにはlsofがインストールされていないため、クエリを実行できません。私ができると思います:

pfiles `ls /proc` | less

「ポート:80」を探しますが、誰かがより良い解決策を持っているなら、私はすべて耳です!ルートにならずにリスニングプロセスを探すことができればさらに良いです。私はシェルとCの両方のソリューションを受け入れています。これが次に登場するときのために、私と一緒に持ち歩く小さなカスタム実行可能ファイルを持っていることを気にしません。

更新:管理者ではないsolarisの一般的なインストールについて話しているので(スーパーユーザーアクセスはありますが)、フリーウェアディスクからインストールすることはオプションではありません。もちろん、どちらもfuser、netstat、またはその他のツールにLinux固有の拡張機能を使用していません。これまでのところ、allプロセスでpfilesを実行することが、残念ながら最良の解決策のようです。それでも問題が解決しない場合は、上記のクリップよりも少し効率的なコードで回答を投稿するでしょう。

このスクリプトはどこかで見つけました。私はどこにいるか覚えていませんが、私にとってはうまくいきます:

#!/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]どのプロセスが特定のポートにバインドされていますか?

28
mavroprovato

ワンライナーは次のとおりです。

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でない限り、他のユーザーのプロセスにアクセスしようとしています。

8

Mavroprovatoの回答は、リスニングポートだけではありません。リスニングポートは、ピアのないソケットです。次の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); }
4
ceving

Solaris 11.2以降では、netstatコマンドを使用してこれを実行できます。ご覧ください こちら-uスイッチはあなたが探しているものです。

Solarisの下位バージョンを使用している場合、他の人が指摘しているように、これを行うSolarisの方法は、pfilesコマンドのスクリプトラッパーのようなものです。ただし、pfilesコマンドは、検査のためにプロセスを一瞬停止することに注意してください。プロセスの99.9%では、これは重要ではありません。残念ながら、pfilesコマンドでヒットした場合にコアダンプを生成するプロセスがあるため、コマンドの使用には少し注意が必要です。 99.9%の場合、状況はまったく異なる可能性があります。つまり、pfilesコマンドを安全に使用できます。

3
peterh

solarisのnetstatはこれを通知せず、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)プロセスで問題が発生し、/ proc/[PID]ディレクトリに2つのファイルしか残されませんでした(psinfoと使用法)。

pfilesはプロセスを見つけることができませんでした(必要な日付がなかったため)

lsofが見つけてくれました。

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

したくないかもしれませんが、最善の策はsunfreeware CDを入手してlsofをインストールすることです。

それ以外は、はい、シェルスクリプトを使用して/ procを探索できます。

1
wnoise

ほとんどの場合、Sunの管理サーバー..通常、Sunのディレクトリと、デフォルトのインストールにある他のいくつかのwebmin-ishのものと一緒にバンドルされています。

0
paan

これは一種の間接的なアプローチですが、ポート80で実行されているものから選択したWebブラウザーにWebサイトがロードされるかどうかを確認できます。そのポートで実行されているものに、あなたはそれをシャットダウンすることができます。ポート80がHTTPトラフィックのデフォルトポートであるため、デフォルトでHTTPサーバーが実行されていますが、保証はありません。

0
Greg Laws

最初の答えは、このアイデアを開発する独自のシェルスクリプトを書いた最高のものだと思います。

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