특정 포트에서 프로세스를 종료하는 스크립트 만들기

특정 포트에서 프로세스를 종료하는 스크립트 만들기

가능한 한 이식 가능하도록 특정 포트의 프로세스를 종료하는 쉘 스크립트("POSIX")를 만들고 싶습니다. 나는 이것을 사용할 수 있다는 것을 알고 있습니다.

portpid() { fstat | grep ":$1" | awk '{print $3}' ;}

그런 다음 다음과 같이 포트 8080에서 수신 대기 중인 프로세스를 종료할 수 있습니다.

$ kill $(portpid 8080)

하지만 이것을 oneliner의 포트 프로세스를 종료하는 프로그램에 결합하고 이 스크립트를 내 명령과 경로에 명명된 별칭으로 추가하려면 어떻게 해야 합니까?

제 생각에는 아래와 같아야 할 것 같습니다.

portpid() { fstat | grep ":$1" | awk '{print $3}' ;}

kill $(portpid $1)

이것을 합치려고 했지만 작동하지 않습니다.

#!/bin/bash
portpid() { fstat | grep ":$1" | awk '{print $3}' ;}    
kill $(portpid $1) 

저는 코헨 쉘을 사용하고 있습니다. 이것은 나의 첫 번째 쉘 스크립트입니다.

답변1

"작동하지 않습니다"라는 말을 듣거나 읽는 것이 일반적이지만 거의 소용이 없습니다.

korn 쉘을 사용하는 것처럼 bash(#!/bin/bash )에 shebang을 사용합니다. 시스템에 최소한 /bin/bash가 있습니까? 이 작은 스크립트의 경우 /bin/ksh를 사용할 수도 있습니다.

당신이 하는 일이 다음으로 확장될 것입니다. (80번으로 전화하세요)

#!/bin/bash
portpid() { fstat | grep ":80" | awk '{print $3}' ;}    
kill $(portpid 80) 

당신이 원하는 것이 아닌가요?

fstat먹이 사용 kill결과

portpid() { fstat | grep ":$1" | awk '{print $3;}' | xargs kill }

여기서 xargs는 이전 명령의 입력을 읽고 kill을 호출합니다.

awk는 다음을 사용하는 대신 greping을 수행할 수 있습니다.

portpid() { fstat |  awk '/'$1'/ {print $3;}' | xargs kill }

포트 번호가 특정 필드(예: 7)에 있는 경우 awk 구문을 이해하는 것 같습니다.

portpid() { fstat |  awk '$7 ~ /'$1'/ {print $3;}' | xargs kill }

답변2

xargs와 함께 lsof를 사용하여 종료할 수 있습니다.

killport() { lsof -i ":$1" -t | xargs kill }

또는

 killport() { kill $(lsof -i ":$1" -t)  }

lsof에는 특별히 이 목적을 위한 플래그가 포함되어 있습니다.

-티 이 옵션은 lsof가 프로세스 식별자만 포함하고 헤더는 포함하지 않는 간결한 출력을 생성해야 함을 지정합니다. 예를 들어 출력이 kill(1)로 파이프될 수 있습니다. 이 옵션은 -w 옵션을 선택합니다.

관련 정보