在带有可选信号的脚本中使用 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

但如果我想做 akill -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"为 pid,而不是"-9"信号 9。

你的引用太聪明了。

相关内容