すべてのバックグラウンドジョブを強制終了します


63

バックグラウンドジョブを強制終了するよりコンパクトな形式は次のとおりですか?

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

また、{1..5}には明らかにハードコードされたマジックナンバーがあります。どうすればNを正しい番号にして「N」にすることができますか。

$(jobs | wc -l)

実際にPS1で\ jを使用して管理対象ジョブの数を取得しますが、これは同等ですか?


3
kill $(jobs -p)簡単そうです。
jw013

可能であれば、ジョブを個別に強制終了します。(私はあなたのコメントを誤解したかもしれませんが)
Robottinosino

for pid in $(jobs -p); do kill $pid; done
jw013

3
@ jw013それは簡単でjobsあるだけでなく、ジョブが連続して番号付けされた場合にのみ機能する出力の行のカウントに基づくソリューションとは異なり、実際には正しいです(回答として投稿してください)。ああ、「ジョブを個別に殺す」ことは無意味です。複数のPIDをkillコマンドに渡すことは、それらを個別に渡すこととまったく同じことです。
ジル 'SO-悪であるのをやめる

私はコマンドを間違って入力し、$(jobs -p)の単語を削除しましたが、私にとっても非常に正しいようです。受け入れる準備ができました。
Robottinosino

回答:


102

ちょうどするにはkillによって管理されるすべてのバックグラウンドジョブはbash、実行します

kill $(jobs -p)

jobsとの両方killがに組み込まれているためbash引数リストのエラーが長すぎると実行しないでください。


2
また、後世のために、バハマトが考えているのは、zshそのトピックに関する権威として彼らを失格にする方法です。
ペス

私はこれを知っているべきだと感じていますが、「$」はここでどのように機能しますか?
フェルサー

1
@fersarr ここに行く
jw013

@bahamatジョブが%+または%-のいずれであるかによって、PIDがフィールド2または3にあるため、実際には機能しません。動作するのはkill %${(k)^jobdirs}、実際にはもっと長いです。PIDをリストする必要がある場合は、さらに長く使用できます${${jobstates#*:*:}%%=*}
ジル 'SO-悪であるのをやめる'

CentOSの上で、私のプロンプトが複数の入力を待っている>
Janacミーナ

15

if が空の場合、killコマンドは失敗するためxargs$(jobs -p)サブコマンドの代わりに使用jobs -pします。

jobs -p | xargs kill

1
しかしこれはまったく同じ効果があり、それがコード123のヘルプを出力して終了します

1
コマンドはOSXでは
正常に

これは、CentOS 6
Janac Meena

jobs -p | xargs -rn10 killjobs -pPIDが返されない場合は、パフォーマンスが向上します。-rオプションはGNU拡張機能であることに注意してください。
NarūnasK

前述のように、これ-r--no-run-if-emptyGNU拡張機能の短い形式であり、stdinにデータがない場合にコマンドを実行xargsないように指示します。
アンソニーG-モニカの正義

3

強制終了する前にジョブが存在するかどうかを確認することをお勧めします-このように、実行中のものが何もない場合でもスクリプトは失敗しません。

入力するのも短くなります。あなたにこれを投げる.bash_profile

function killjobs () {
    JOBS="$(jobs -p)";
    if [ -n "${JOBS}" ]; then;
        kill -KILL ${JOBS};
    fi
}

次に実行します:

killjobs

実行中のジョブを強制終了します。


1

macOSで各プロセスにSIGINTを送信することにより、正常に終了したいバックグラウンドの複合コマンドがいくつかあります。他のソリューションはどれも適切に機能しなかったため、私はこれを思いつきました:

jobs -p | xargs -n1 pkill -SIGINT -g

jobs -p 現在のシェルによって開始されたバックグラウンドプロセスを一覧表示します。

xargs -n1 ジョブごとにpkillを1回実行します。

pkill -SIGINT -g プロセスグループ内のすべてのプロセスにSIGINT(ctrl + cと同じ)を送信します。


1

出力の内容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

1
どのシェルを使用していますか?何がecho $0表示されますか?何がhelp jobs表示されますか?図の出力はPOSIX準拠ではありません実装にjobs-p、意図した動作を持つオプションが必要です。
ワイルドカード

1
これを指摘してくれてありがとう。私はzshを使用していますが、それが奇妙な出力の理由です。bashに切り替えて、jobs -pPIDのみを出力しました。zshが完全にPOSIXに準拠していないことを知りました。
ファンチェンバオ

0

jobs -p | xargs kill仕事をするようですが、それは殺すためにパイプされたいくつかの不要な出力を生成します。ここでjobs -pは、+または-文字を使用するかどうかによって、出力をグループ化しています。

function killjobs() {
    JOBS=$(jobs -p)
    echo $JOBS | grep -v "+\|-"| awk '{print $2}' | xargs kill -9
    echo $JOBS | grep "+\|-"| awk '{print $3}' | xargs kill -9
}

後で電話するだけです killjobs

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.