나는 종종 예를 들어
sudo netstat -lpn |grep :8088
출력을 본다
tcp6 0 0 :::8088 :::* LISTEN 11189/java
그리고
sudo kill -kill 11189
killatport 8088
tcp 포트 번호를 변수로 사용하고 원하는 것을 수행하는 파이프 라인의 별칭으로 만들 수있는 것과 같은보다 편리한 명령을 원합니다. 그러나 출력 및 파이프에서 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 {}
설명:
-
netstat -ltpn
- 포트 번호를 이름 ( )으로 확인하지 않고
l
TCP (t
) 의 청취 포트 ( ) 및 해당 프로그램 (p
)을 나열합니다n
.
- 포트 번호를 이름 ( )으로 확인하지 않고
-
grep ":1234\b"
- 이 검색에 대한
:1234
경계 (하였다\b
(우리의 경우에, 또는 수) 단어의 끝을 나타낸다). 이를 통해:12345
예를 들어 잡을 수 없습니다 .
- 이 검색에 대한
-
awk '{sub(/\/.*/, "", $NF); print $NF}'
-
이
- 대용품
sub(/regex/,"replacewith", #fieldnumber)
- 이 정규식
\/.*
- 아무것도없이
""
- 현장에서
$NF
마지막 필드를 의미한다 (이 들어있는 필드를 즉PID/program
) - 그런 다음 인쇄합니다
print $NF
.
정규 표현식
\/.*
은 리터럴/
과 그 뒤에 나오는 모든 것을 일치시킨 다음 아무것도 대체하지 않고 본질적으로 삭제하므로 해당 필드에는 PID 번호 만 남습니다. - 대용품
-
-
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