PID 대신 kill 주어진 tcp 포트 번호를 사용하는 Oneliner 명령?

나는 종종 예를 들어

sudo netstat -lpn |grep :8088

출력을 본다

tcp6       0      0 :::8088                 :::*                    LISTEN      11189/java

그리고

sudo kill -kill 11189

killatport 8088tcp 포트 번호를 변수로 사용하고 원하는 것을 수행하는 파이프 라인의 별칭으로 만들 수있는 것과 같은보다 편리한 명령을 원합니다. 그러나 출력 및 파이프에서 PID를 얻는 방법 kill 명령으로? netstat의 출력에서 ​​PID를 가져 오기 위해 awk를 사용할 수 있다고 가정하지만 입력 80이 8080과 일치하지 않도록 정확히 포트를 보호하고 정확하게 일치시키는 방법은 무엇입니까? 대신 C 프로그램으로 만들어야합니까? 아니면 이미 이와 같은 작은 유틸리티가 있습니까?



답변

퓨저 는 다음을 수행 할 수 있습니다.

sudo fuser -KILL -k -n tcp 8088

답변

명령은 다음과 같이 공식화 될 수 있습니다.

netstat -lpn | grep ":1234\b" | awk '{sub(/\/.*/, "", $NF); print $NF}' | xargs -i kill -kill {}

설명:

  1. netstat -ltpn

    • 포트 번호를 이름 ( )으로 확인하지 않고 lTCP ( t) 의 청취 포트 ( ) 및 해당 프로그램 ( p)을 나열합니다 n.
  2. grep ":1234\b"

    • 이 검색에 대한 :1234경계 (하였다 \b(우리의 경우에, 또는 수) 단어의 끝을 나타낸다). 이를 통해 :12345예를 들어 잡을 수 없습니다 .
  3. awk '{sub(/\/.*/, "", $NF); print $NF}'

      • 대용품 sub(/regex/,"replacewith", #fieldnumber)
      • 이 정규식 \/.*
      • 아무것도없이 ""
      • 현장에서 $NF마지막 필드를 의미한다 (이 들어있는 필드를 즉 PID/program)
      • 그런 다음 인쇄합니다 print $NF.

      정규 표현식 \/.*은 리터럴 /과 그 뒤에 나오는 모든 것을 일치시킨 다음 아무것도 대체하지 않고 본질적으로 삭제하므로 해당 필드에는 PID 번호 만 남습니다.

  4. xargs -i kill -kill {}

    • xargs -i이전 명령의 출력을 다른 명령의 입력으로 사용하도록하는 프로그램입니다. 우리의 명령은 kill -kill {}어디에서 {}우리의 PID 번호 “파이프 라인의 이전 명령의 출력을”을 나타냅니다.

참고 : 이 전체 명령은 원하지 않는 것을 실수로 죽일 수 있기 때문에 약간 위험 할 수 있습니다. 좀 더 위생적으로 사용할 수 있습니다. 사용할 때 올바른 포트 번호를 얻으십시오.

이것을 함수로 만들고 싶다면 다음을 추가 할 수 있습니다 ~/.bashrc.

killatport(){
    netstat -lpn | grep ":$1\b" | awk '{sub(/\/.*/, "", $NF); print $NF}' | xargs -i kill -kill {}
}

을 사용하여 변경 사항을 저장하고 적용하십시오 source ~/.bashrc. 이제 다음과 같은 기능을 사용할 수 있습니다.

killatport 8088