オプションのシグナルを含むスクリプトで 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

しかし、次のことをしたい場合は、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"

あなたの引用は非常に賢いです。

関連情報