オプションのシグナルを含むスクリプトで 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)はあなたの状況とほぼ正確に一致します。

おすすめ記事