5

私も書いた特定のサーバーアプリケーションを監視するSNMPモジュールを書かなければなりません。問題は、このアプリケーションが実行されているかどうかを知る必要があり、できる限り強制終了できる必要があることです。

アプリケーションがリッスンしている (アプリケーション構成ファイルを読み取っている) ポートを知っており、このポートをソケットにバインドして、自分のアプリケーションまたは別のアプリケーションで使用されている (または使用されていない) かどうかを知ることができます。私のモジュールのために。コードは次のとおりです。

int
get_server_status()
{
        struct sockaddr_in local;
        int port,sockfd;

        if (parse_config_file(&port,NULL,CONFIG_FILE_PATH) == -1)
                return -1; //Error

        if ((sockfd = socket ( AF_INET, SOCK_STREAM, 0 )) < 0)
                return -1; //Error

        local.sin_family = AF_INET;
        local.sin_port = htons ( port );
        local.sin_addr.s_addr = inet_addr ("127.0.0.1");

        if (bind(sockfd, (struct sockaddr *) &local, sizeof (local) ) < 0 ){
                if(errno == EADDRINUSE)
                        return 1; //Port being used
                else
                        return -1; //Error
        }else{
                close(sockfd);
                return 0;         //Port not being used

        }
}

問題は、アプリケーションを強制終了する必要があるときに発生します。アプリケーションPIDも取得方法もわかりません。使用することはできますがnetstat -tln <port>、プログラムで行う方法がわかりません。何か案は??

4

2 に答える 2

6

のようnetstatに、あなたは読むべき/proc/net/tcpです。

それを解釈する:

  1. 「」というタイトルの2番目のフィールドlocal_addressは、IPとポートです。00000000:0050HTTPになります(ポート番号は16進数です)。
  2. 「」というタイトルの4番目のフィールドstは状態です。AですTCP_LISTEN
  3. タイトルの10番目のフィールドinodeは、iノード番号(今回は10進数)です。
  4. プロセス/proc/pid/fd/ごとに、開いているファイル記述子ごとのエントリが含まれます。ls -lソケット記述子の場合、それがへのリンクであることを示していますsocket:[nnnnnn]。番号nnnnnnは、からのiノード番号と一致する必要があり/proc/net/tcpます。

これにより、プロセスを見つけるのは非常に面倒になりますが、可能です。
で正しい行を見つけるの/proc/net/tcpは難しくありません。そうすれば、iノード番号を取得できます。
プロセスを見つけるには、すべてのプロセスをスキャンして、このiノード番号を参照しているプロセスを探す必要があります。これ以上の方法はわかりません。

于 2012-06-12T13:59:08.377 に答える
3

確かに、netstatをフォークするか、netstatが行うことを実行できます(ある種のUNIXで作業していると思います)。

/ proc / net / tcp'ファイル'は、現在のtcpソケットを示します。各行は、ソケットに関する情報を提供します。local_addressフィールドには、ローカルアドレスがIP:PORT形式で16進数で表示されます。そこから、リスニングポートに対応するソケットを見つけることができます。次に、対応するiノードファイルを取得し、すべての/ proc//fdリンクで次の形式で検索する必要があります。

->ソケット:[]

それが役に立てば幸い

于 2012-06-12T13:46:48.757 に答える