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が変更され、接続を終了したときにリスナーとして他のプロセス(または実際のプロセスの場合、この動作はランダムに見える)として誤って応答する可能性があるとします。そのポートのすべてのクライアントについて、正しいrmsock
PID実際のリスナーの情報が常に返されます。
アーキテクチャについてもっと知りたい場合は、次のようにします。他のプログラムはサービスを要求するためにそのポートに接続し、リスナーは各クライアント要求をサービスを提供するプログラムのインスタンスに転送するスイッチャですが、この場合は同じプログラムで同じポートに接続されます。下図:
答え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