すべてのバックグラウンドジョブの終了

すべてのバックグラウンドジョブの終了

以下より簡潔な形式のバックグラウンドジョブ終了はありますか?

for i in {1..5}; do kill %$i; done

また、{1..5}には明らかにハードコードされたマジックナンバーがあります。以下を実行せずに「N」にする方法は?ここで、Nは正しい数値です。

$(jobs | wc -l)

実際に管理されているジョブの数を取得するためにPS1で\ jを使用しています。これは同じですか?

答え1

kill以下で管理するすべてのバックグラウンドbashジョブの場合

kill $(jobs -p)

と両方が組み込まれているため、エラーは発生しないでくださいjobskillbashパラメータリストが長すぎます。タイプ。

答え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

したがって、私の解決策は、次のようにgrepPIDを最初にインポートしてから使用することです。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

実行中のジョブをすべて終了します。

関連情報