
.NET Frameworkで指定された特定のポートを使用して、すべてのプロセスを終了する必要があるbash関数を作成しようとしていますport_array
。kill-port
たとえば、ポートを使用して関数を直接呼び出すと、kill-port "80";
forループ内で呼び出すと奇妙なエラーが発生しますkill
。
Usage:
kill [options] <pid> [...]
Options:
<pid> [...] send signal to every <pid> listed
-<signal>, -s, --signal <signal>
specify the <signal> to be sent
-l, --list=[<signal>] list all signal names, or convert one to a name
-L, --table list all signal names in a nice table
-h, --help display this help and exit
-V, --version output version information and exit
For more details see kill(1).
コードは次のとおりです。
#!/bin/bash
port_array=( 5057 5061 5056 );
function kill-ports () {
ports=( "$@" )
for i in "${ports[@]}";
do
kill-port $i;
done
};
function kill-port () {
lsof -i tcp:"$1" | awk 'NR!=1 {print $2}' | xargs kill;
}
kill-ports "${port_array[@]}";
おそらく私の間違いを監督しているでしょう。しかし、ここで問題が何であるかを教えてくれる人がいれば感謝します。
挨拶、
シラ
答え1
kill-ports() {
for port in "$@"; do fuser -n tcp "$port" -k -TERM; done
}
(この場合は必ず引用符は必要ありませんが、必ず引用符を使用することをお勧めします。そうしないと、人々から苦情/訂正を受けます。)
答え2
@StéphaneChazelasのコメントのおかげで解決策があります。
「ただし:
lsof -ti "tcp:$1" | xargs -r kill
、
それが-t
目的です(そして-r
言うパラメータパラメーターがないと、コマンドは実行されません。それは牛に似た一種の栄養xargs。次のような他の実装FreeBSDこれは自動的に行われます。」
結局こんな姿になる返品動作します(掃除も少ししました):
#!/bin/bash
port_array=( 5057 5061 5056 );
kill-ports() {
for port in "$@";
do
kill-port "$port";
done
};
kill-port () {
lsof -ti "tcp:$1" | xargs -r kill;
}
kill-ports ${port_array[@]};
編集する:
@PSkocikの解決策は@StéphaneChazelasのコメントの後に投稿されましたが、うまくいきます。
#!/bin/bash
port_array=( 5057 5061 5056 );
kill-ports() {
for port in "$@"; do fuser -n tcp "$port" -k -TERM; done
}
kill-ports ${port_array[@]};
答え3
殺すには-9を追加してください。
lsof -i tcp:"$1" | awk 'NR!=1 {print $2}' | xargs kill -9;