AIX "rmsock" この tcp4 ポートのリスニングに無効な pid が表示されます。

AIX

AIX 7.1で実際のリスナーPIDを取得する方法は?rmsockインターネットで広く説明されているように動作しないでください。

https://www-01.ibm.com/support/docview.wss?uid=isg3T1019570

ケース:

実行時にパラメータによって選択されるサーバープロトコルとクライアントプロトコルの両方を実装するプログラムがあります。良い:

$ myprogram -switcher-mode:port
$ myprogram -provider-mode:port

リスナーが起動したら、を使用してPIDを取得できますrmsock。ランダムなポート番号40000を考えてみましょう。

$ netstat -Aan | grep '\.40000.*LISTEN$' | awk '{ print $1 }' | xargs -n1 -i rmsock {} tcpcb
The socket 0xf1000e000334b808 is being held by proccess 10683226 (serviceprg)

$ ps -fp 10683226
     UID      PID     PPID   C    STIME    TTY  TIME CMD
    test 10683226        1   0 08:17:43      -     2 serviceprg -switcher-mode:40000

これが正しいプロセスであり、スイッチャがポートでリッスンしていることがわかります。serviceprg - スイッチャーモード:40000

問題が始まると:

プロバイダモード(バックグラウンド)で新しいプロセスを開始すると、rmsockリスナーのようにPIDを返すことができます(任意)。ただし、スイッチがバースト要求を実行するためにより多くのプロバイダーが必要であると感じた場合、これらのプロセスは手動で自動的に開始される可能性があるため(両方とも問題を引き起こす可能性があります)、次libc.aの機能を使用してより多くのマルチプロバイダーを開始するしますsystem()

system("serviceprg -provider-mode:40000 1>/dev/null 2>/dev/null &");

したがって、これを使用してリスターPIDを確認すると、rmsock以下のように誤ったPIDが返されることがあります。

$ netstat -Aan | grep '\.40000.*LISTEN$' | awk '{ print $1 }' | xargs -n1 -i rmsock {} tcpcb
The socket 0xf1000e000334b808 is being held by proccess 10690461 (serviceprg)

$ ps -fp 10690461
     UID      PID     PPID   C    STIME    TTY  TIME CMD
    test 10690461        1   0 08:20:04      -  1:10 serviceprg -provider-mode:40000

このPIDに対して実行されているプログラムが実際のリスナーの後に開始されたプロセスであること、およびポートをリッスンせずにクライアントプログラムに接続していることを確認してください。serviceprg-サプライヤーモード: 40000

rmsockプロセスを終了すると、上記のPID 10690461が変更され、接続を終了したときにリスナーとして他のプロセス(または実際のプロセスの場合、この動作はランダムに見える)として誤って応答する可能性があるとします。そのポートのすべてのクライアントについて、正しいrmsockPID実際のリスナーの情報が常に返されます。


アーキテクチャについてもっと知りたい場合は、次のようにします。他のプログラムはサービスを要求するためにそのポートに接続し、リスナーは各クライアント要求をサービスを提供するプログラムのインスタンスに転送するスイッチャですが、この場合は同じプログラムで同じポートに接続されます。下図: ここに画像の説明を入力してください。

ベストアンサー1

完全なプロセスリストが提供されていないため、netstat -Aanプロバイダープロセスとスイッチャープロセスを区別するには、PCB IDを収集してからPIDを収集し、パラメーターを確認する必要があります。

for pid in $(netstat -Aan | grep '\.40000.*LISTEN$' | awk '{ print $1 }' | xargs -n1 -i rmsock {} tcpcb | awk '{print $9}')
do
  ps -o args= -p "$pid" | grep -q "provider-mode:" && echo this is a provider
  ps -o args= -p "$pid" | grep -q "switcher-mode:" && echo this is a switcher
done

おすすめ記事