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