29

そこで、Solarisボックスにログインして、Apacheを起動しようとすると、ポート80でリッスンしているプロセスがすでに存在し、Apacheではないことがわかります。私たちのボックスにはlsofがインストールされていないので、それでクエリすることはできません。私はできると思います:

pfiles `ls /proc` | less

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

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

4

11 に答える 11

29

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

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

于 2009-05-05T14:36:07.977 に答える
4

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); }
于 2012-03-14T14:24:34.513 に答える
3

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

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

于 2014-06-30T11:20:36.497 に答える
1

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

#!/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
于 2013-09-03T16:39:11.470 に答える
1

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

それ以外は、シェル スクリプトを使用して /proc でうろつくことができます。

于 2008-09-22T23:26:42.450 に答える
0

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

于 2008-09-18T09:26:32.513 に答える
0

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

于 2008-10-08T13:49:56.620 に答える
-3

にアクセスできる場合はnetstat、それを正確に行うことができます。

于 2008-09-18T09:25:54.573 に答える