以下より簡潔な形式のバックグラウンドジョブ終了はありますか?
for i in {1..5}; do kill %$i; done
また、{1..5}には明らかにハードコードされたマジックナンバーがあります。以下を実行せずに「N」にする方法は?ここで、Nは正しい数値です。
$(jobs | wc -l)
実際に管理されているジョブの数を取得するためにPS1で\ jを使用しています。これは同じですか?
答え1
kill
以下で管理するすべてのバックグラウンドbash
ジョブの場合
kill $(jobs -p)
と両方が組み込まれているため、エラーは発生しないでくださいjobs
。kill
bash
パラメータリストが長すぎます。タイプ。
答え2
空の場合、killコマンドは失敗するため、サブコマンドのxargs
代わりに使用してください。$(jobs -p)
jobs -p
jobs -p | xargs kill
答え3
私は出力によってjobs -p
解決策が少し異なるかもしれないと思います。私として
$ jobs -p
[1] - 96029 running some job
[2] + 96111 running some other job
したがって、そうしても何の利点もありません。
$ jobs -p | xargs kill
kill: illegal process id: [1]
一方、実行はkill $(jobs -p)
機能しますが、PIDではない文字列もkill
。
したがって、私の解決策は、次のようにgrep
PIDを最初にインポートしてから使用することです。xargs
$ jobs -p | grep -o -E '\s\d+\s' | xargs kill
答え4
私は、ジョブを終了する前にジョブが存在することを確認することを好みます。これにより、何も実行されなくてもスクリプトは失敗しません。
タイピングも短くなります。これをあなたのものに投げます.bash_profile
:
function killjobs () {
JOBS="$(jobs -p)";
if [ -n "${JOBS}" ]; then;
kill -KILL ${JOBS};
fi
}
次に、次を実行します。
killjobs
実行中のジョブをすべて終了します。