수신 대기 중인 포트가 제대로 닫히지 않으면 가끔 충돌이 발생하는 레거시 응용 프로그램(제어할 수 없음)이 있습니다. 시스템을 재부팅하지 않고 특정 포트에서 수신 대기를 중지하는 Solaris 명령이 있습니까?
답변1
음. 아직 열려 있는 포트를 찾으려면 좀비가 되었거나 더 이상 사용할 수 없는 프로세스를 찾아야 합니다. 프로세스 이름이나 PID를 알고 있는 경우 pfiles
, preap
및 등의 명령을 사용합니다 pkill
.
열린 포트를 찾기 위해 PID 또는 프로세스 이름을 검색하는 스크립트가 있습니다.
#!/usr/bin/ksh -p
process=$1
# if $1 is all numbers, then assume it's a PID, and get the parent process.
if [[ $process = +([0-9]) ]]; then
for pid in $( ptree $process | grep '^[0-9]' | awk '{print $1}' ); do
pfiles $pid | egrep "^$pid:|sockname"
done
else
# if $1 is/has letters, then assume it's a process name, and grep accordingly.
for pid in $( ptree | grep $process | grep '^[0-9]' | awk '{print $1}' ); do
pfiles $pid | egrep "^$pid:|sockname"
done
fi
그러면 $1과 일치하는 프로세스에 대해 열린 PID, 프로세스 이름 및 소켓이 인쇄됩니다.
소켓을 열어두고 사용할 수 없는 상태로 유지하는 PID가 무엇인지 정확히 알고 나면 pkill
또는 명령 preap
중 하나를 사용하여 해당 PID와 열려 있는 파일 설명자를 강제로 닫을 수 있습니다.
답변2
포트가 여전히 수신 대기 중인 경우 애플리케이션은 어떤 방식으로든 계속 실행 중입니다. 명령 사용lsof-i어떤 프로세스가 아직 수신 대기 중인지 확인하고 종료하세요.
당신이 없다면라소프도구를 설치한 후 다음을 검색해야 합니다.폴리스티렌-EF아직 실행 중인 애플리케이션 프로세스의 경우.