特定のポートでサーバーをシャットダウンするスクリプト:
#!/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"
あなたの引用は非常に賢いです。