在带有可选信号的脚本中使用 xargs 和kill

lon*_*nix 3 scripting bash kill ubuntu xargs

用于终止某个端口上的服务器的脚本:

\n
#!/bin/bash\n\nPORT="$1"\nSIGNAL="$2"\n\nif [ "${SIGNAL}" != "" ]; then SIGNAL=" -${SIGNAL}"; fi\n\nlsof -i:"${PORT}" |\\\n  grep -e "localhost:${PORT}" -e TCP -e LISTEN |\\\n  tr -s \' \' |\\\n  cut -d\' \' -f2 |\\\n  tee /dev/tty |\\\n  xargs --no-run-if-empty kill "$SIGNAL"\n
Run Code Online (Sandbox Code Playgroud)\n

作品:killbyport 4242

\n

但如果我想做一个kill -9我会做的:killbyport 4242 9,\n并且错误:

\n
kill: (-9): No such process\n
Run Code Online (Sandbox Code Playgroud)\n

xargs不合作kill\xe2\x80\x93 我该如何修复它?

\n

(PS:我想修复这个脚本,而不是将其更改为其他内容。它几乎可以工作了。)

\n

G-M*_*ca' 12

问题是您\xe2\x80\x99 明确添加了一个空格SIGNAL

\n
SIGNAL=" -${SIGNAL}"\n
Run Code Online (Sandbox Code Playgroud)\n

然后在引号中引用它:

杀死“$信号”
\n由于kill看到一个不以破折号开头的参数\n(因为它以空格开头,然后是破折号),因此 \n\xe2\x80\x99t 不被视为一个选项,\n而是作为一个普通的在这种情况下,参数 \xe2\x80\x94 为 a\xc2\xa0PID。\xc2\xa0\nA\xc2\xa0 快速解决方法是不将空格添加到SIGNAL

\n

SIGNAL="-${SIGNAL}"\n
Run Code Online (Sandbox Code Playgroud)\n
\n

但\xe2\x80\x99t在为空时起作用是没有意义的SIGNAL。\xc2\xa0\n参见但是如果\xe2\x80\xa6呢?.\xc2\xa0\n第一个示例 ( ignorecase) 几乎完全符合您的情况。

\n