특정 애플리케이션의 각 프로세스에서 사용하는 소켓(프로세스당 하나의 소켓)을 모니터링하기 위해 lsof 기반 스크립트를 작성했습니다. 열린 파일 목록을 소켓으로 제한하기 위해 -i 옵션을 지정하면 일부 프로세스가 손실됩니다.
pid_list를 136개 프로세스의 일정하고 올바른 형식의 쉼표로 구분된 목록으로 둡니다. 결과가 때때로 136보다 작은 이유는 무엇입니까?
$ lsof -p $pid_list -a -i -nP -FpcnT | grep ^p | wc -l
135
$ lsof -p $pid_list -a -i -nP -FpcnT | grep ^p | wc -l
134
$ lsof -p $pid_list -a -i -nP -FpcnT | grep ^p | wc -l
136
문제를 재현하는 데는 1개의 PID만 필요합니다.
$ clear ; lsof -p 5404 -a -i -nP -FpcnT
p5404
cprocess
nsource:port->dest:port
TST=ESTABLISHED
TQR=0
TQS=0
$ clear ; lsof -p 5404 -a -i -nP -FpcnT
### OOPS!!!
$ clear ; lsof -p 5404 -a -i -nP -FpcnT
p5404
cprocess
nsource:port->dest:port
TST=ESTABLISHED
TQR=0
TQS=0
프로세스는 중단 없이 실행됩니다. 각 프로세스에는 LISTEN 또는 ESTABLISHED 상태의 소켓이 있습니다. 소켓은 IPv4입니다. 이는 lsof 4.78이 포함된 RHEL 5.11에 있습니다.
lsof 옵션을 생략하면 -i
항상 올바른 수의 프로세스가 인쇄됩니다. 하지만 모든 프로세스의 IP와 포트 번호가 필요하기 때문에 이 출력을 제 목적으로 사용할 수 없습니다.
lsof가 무시한 프로세스는 무작위인 것으로 보입니다. 그들은 결코 동일하지 않습니다.
lsof가 뭔가에 민감한 것 같지만무엇?
2016-07-26 편집
해결 방법으로 netstat를 사용해 보았지만 동일한 문제가 발생했습니다. 문제는 내 응용 프로그램에만 국한될 수도 있고 내 응용 프로그램의 기능과 운영 체제 제한 사항이 결합되어 있을 수도 있습니다. lsof/netstat가 올바르게 보고하지 못하는 문제가 있습니다.
답변1
sudo 권한을 사용해 보세요. sudo 권한으로 명령을 실행하지 않으면 일부 프로세스가 나타나지 않습니다.