現在のシェルで実行されているかどうかにかかわらず、すべてのバックグラウンドジョブをどのように終了できますか?

現在のシェルで実行されているかどうかにかかわらず、すべてのバックグラウンドジョブをどのように終了できますか?

~からhttps://unix.stackexchange.com/a/43709/674

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

kill $(jobs -p)

kill $(jobs -p)現在シェルで「実行中」のバックグラウンドジョブのみを終了し、「停止」されているか、シェルで他のジョブを終了しませんか?

現在、シェルで実行しているか停止しているか、他の方法ですべてのバックグラウンドタスクをどのように終了しますか?

たとえば、次のようにしてless2つの停止ジョブを作成しましたctrl+z

$ ps | less

[1]+  Stopped                 ps | less
$ less recover_jobs.sh

[2]+  Stopped                 less recover_jobs.sh

$ jobs -l
[1]-  2753 Done                    ps
      2754 Stopped                 | less
[2]+  2842 Stopped                 less recover_jobs.sh
$ jobs -p
2753
2842

$ kill $(jobs -p)
bash: kill: (2753) - No such process
$ kill 2754
$ kill 2842
$ jobs -l
[1]-  2753 Done                    ps
      2754 Stopped                 | less
[2]+  2842 Stopped                 less recover_jobs.sh

$ fg 1
ps | less
Terminated
$ fg 2
less recover_jobs.sh
Terminated

理由を知りたいです。

  • kill $(jobs -p)stoppedどんな仕事も殺さないでしょう。

  • jobs -p停止したジョブのpid 2754を表示するのではなく、| less完了したジョブのpid 2753を表示しますps

  • kill 2754kill 2842終了せずに動作| lessを停止しましたless recover_jobs.sh
  • タスクを中断するとfgすぐに表示されますが、Terminated私の前には表示されませんかfg

ありがとうございます。

ベストアンサー1

kill $( jobs -p )TERMみんなに信号を送るよ働く、実行するかどうかにかかわらず。ジョブには複数のプロセスを含めることができますが、各ジョブの最初のプロセスだけがシグナルを受け取ります(下記参照)。

最初、3番目、最後の質問に対する答えは同じです。停止した操作は実行されません。受け取るどんな信号でも。シグナルハンドラ(基本ハンドラを含む)はプロセスで実行され、プロセスは次のとおりです。停止。信号は出版するジョブが再開したら。

2番目の質問は、jobs -pプロセスのプロセスIDのみを提供すると思います。最初jobs -lすべてのジョブに属するすべてのプロセスが一覧表示されている間、パイプライン内のプロセスが一覧表示されます。パイプを終了する最初のプロセスは、次のプロセスが読み取っているファイル記述子を閉じるので、次に読み取ろうとしたときにファイルの終わりを通知します。

おすすめ記事