슬램 | 포트 종료 루프 실패

슬램 | 포트 종료 루프 실패

.NET Framework에 지정된 특정 포트를 사용하여 모든 프로세스를 종료해야 하는 bash 함수를 만들려고 합니다 port_array. kill-port예를 들어 포트를 사용하여 함수를 직접 호출하면 kill-port "80";for 루프 내에서 호출하면 이상한 오류가 발생합니다 kill.

Usage:
kill [options] <pid> [...]

Options:
<pid> [...]            send signal to every <pid> listed
-<signal>, -s, --signal <signal>
                    specify the <signal> to be sent
-l, --list=[<signal>]  list all signal names, or convert one to a name
-L, --table            list all signal names in a nice table

-h, --help     display this help and exit
-V, --version  output version information and exit

For more details see kill(1).

코드는 다음과 같습니다.

#!/bin/bash

port_array=( 5057 5061 5056 );
function kill-ports () {
    ports=( "$@" )
    for i in "${ports[@]}"; 
    do
        kill-port $i;
    done
};

function kill-port () {
   lsof -i tcp:"$1" | awk 'NR!=1 {print $2}' | xargs kill;
}


kill-ports "${port_array[@]}";

아마도 내 실수를 감독하고 있을 것입니다. 그러나 여기서 문제가 무엇인지 말해 줄 수 있는 사람이 있다면 감사하겠습니다.

인사,

실라

답변1

kill-ports() {
   for port in "$@"; do fuser -n tcp "$port" -k -TERM; done
}

(이 경우에는 반드시 인용문이 필요하지 않지만 항상 인용문을 사용하는 것이 좋습니다. 그렇지 않으면 사람들로부터 불만/수정 사항을 받게 됩니다.)

답변2

@StéphaneChazelas의 의견 덕분에 해결책이 있습니다.

"그냥 해:

lsof -ti "tcp:$1" | xargs -r kill,

그게 -t목적이에요 (그리고 -r말해요매개변수매개변수가 없으면 명령이 실행되지 않습니다. 그건암소 비슷한 일종의 영양xargs. 다음과 같은 다른 구현FreeBSD이 작업은 자동으로 수행됩니다)"

결국 이런 모습이 된다반품작동합니다(청소도 좀 했습니다):

#!/bin/bash

port_array=( 5057 5061 5056 );
kill-ports() {
   for port in "$@"; 
   do
       kill-port "$port";
   done
};

kill-port () {
   lsof -ti "tcp:$1" | xargs -r kill;
}

kill-ports ${port_array[@]};

편집하다:

@PSkocik의 솔루션은 @StéphaneChazelas의 의견 다음에 게시되었지만 잘 작동합니다.

#!/bin/bash

port_array=( 5057 5061 5056 );

kill-ports() {
   for port in "$@"; do fuser -n tcp "$port" -k -TERM; done
}

kill-ports ${port_array[@]};

답변3

죽이려면 -9를 추가해 보세요.

lsof -i tcp:"$1" | awk 'NR!=1 {print $2}' | xargs kill -9;

관련 정보