AIX "rmsock"이 tcp4 포트 수신에 대해 잘못된 pid를 표시합니다.

AIX "rmsock"이 tcp4 포트 수신에 대해 잘못된 pid를 표시합니다.

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

관련 정보