![在带有可选信号的脚本中使用 xargs 和kill](https://linux22.com/image/203470/%E5%9C%A8%E5%B8%A6%E6%9C%89%E5%8F%AF%E9%80%89%E4%BF%A1%E5%8F%B7%E7%9A%84%E8%84%9A%E6%9C%AC%E4%B8%AD%E4%BD%BF%E7%94%A8%20xargs%20%E5%92%8Ckill.png)
用于终止某个端口上的服务器的脚本:
#!/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。
你的引用太聪明了。