특정 포트에서 서버를 종료하는 스크립트:
#!/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"
당신의 인용문은 매우 영리합니다.