선택적 신호가 있는 스크립트에서 xargs 및 kill 사용

선택적 신호가 있는 스크립트에서 xargs 및 kill 사용

특정 포트에서 서버를 종료하는 스크립트:

#!/bin/bash

PORT="$1"
SIGNAL="$2"

if [ "${SIGNAL}" != "" ]; then SIGNAL=" -${SIGNAL}"; fi

lsof -i:"${PORT}" |\
  grep -e "localhost:${PORT}" -e TCP -e LISTEN |\
  tr -s ' ' |\
  cut -d' ' -f2 |\
  tee /dev/tty |\
  xargs --no-run-if-empty kill "$SIGNAL"

일하다:killbyport 4242

하지만 다음을 수행하고 싶다면 kill -9다음과 같이 하면 killbyport 4242 9오류가 발생합니다.

kill: (-9): No such process

그리고 xargs비협력 kill– 이 문제를 어떻게 해결합니까?

(PS: 저는 이 스크립트를 다른 것으로 변경하지 않고 수정하고 싶습니다. 거의 작동합니다.)

답변1

문제는 명시적으로 공백을 추가했다는 것입니다 SIGNAL.

SIGNAL=" -${SIGNAL}"

그런 다음 따옴표로 묶으십시오.

죽이다"$신호"
kill다툼을 봤기 때문에아니요대시로 시작하는 경우(공백으로 시작한 다음 대시로 시작하므로) 옵션으로 간주되지 않고 일반 매개변수(이 경우 PID)로 간주됩니다. 빠른 수정은 다음과 같습니다.아니요다음에 공백 추가 SIGNAL:

SIGNAL="-${SIGNAL}"

그러나 null인 경우 이는 의미가 없습니다 SIGNAL. 바라보다하지만 만약...?. 첫 번째 예( ignorecase)는 귀하의 상황과 거의 정확하게 일치합니다.

답변2

@G-Man의 대답은 나를 올바른 방향으로 이끌었습니다. 완전성을 위해 다음을 사용하여 수정합니다.

xargs --no-run-if-empty kill ${SIGNAL:+"-$SIGNAL"}

답변3

그 결과 kill " -9"... 명령이 실행되었습니다. 이는 잘못된 것입니다. Kill은 신호 9 " -9"가 아닌 pid로 해석됩니다 ."-9"

당신의 인용문은 매우 영리합니다.

관련 정보