
가능한 한 이식 가능하도록 특정 포트의 프로세스를 종료하는 쉘 스크립트("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 옵션을 선택합니다.