web-dev-qa-db-ja.com

(最後の-1)PIDをbashで殺す方法

私は最後のプロセスを殺す方法を知っています

 kill $!

ただし、最後の1つのプロセス、つまり最後のプロセスではなく、最後のプロセスの前のプロセスを強制終了したいと思います。

私は試した

 kill $$(($! -1))

しかし、それはうまくいきませんでした。

2
musicisme

概要:

jobsを使用して一覧表示し、kill %nを使用してn番目のバックグラウンドプロセスを強制終了します。bashがそれをサポートしている場合:kill %-1はn-1番目のバックグラウンドプロセスを強制終了します。

詳細:

# find / -print >/dev/null 2>/dev/null &
[1] 1291234
# find /./ -print >/dev/null 2>/dev/null &
[2] 2162424
# find /././ -print >/dev/null 2>/dev/null &
[3] 680176
#
# jobs
[1]   Running                 find / -print >/dev/null 2>/dev/null &
[2]-  Running                 find /./ -print >/dev/null 2>/dev/null &
[3]+  Running                 find /././ -print >/dev/null 2>/dev/null &
# kill %2  # or kill %-1  if your version of bath supports it
#
[2]-  Terminated              find /./ -print >/dev/null 2>/dev/null
# jobs
[1]-  Running                 find / -print >/dev/null 2>/dev/null &
[3]+  Running                 find /././ -print >/dev/null 2>/dev/null &
#

[2]- Terminated find /./ -print >/dev/null 2>/dev/nullメッセージを表示するために必要な追加の「入力」に注意してください(次のプロンプトの前にのみ表示されます)

さて、bashがkill %-n表記をサポートしている場合:それは簡単です:

kill %-1  # will kill not the n'th (or last), but the n-1'th backgrounded process

しかし、bashがkill %-1をサポートしていない場合:これは自動化の(過度に複雑な...)試みです(これは、殺されるn-1番目のジョブがある場合にのみ殺されるべきです...うまくいけば)

jobs \
  | awk 'BEGIN {cur="";}

           /./ { last=cur ; cur=$0 ; }

           END { if ( last != "")
                 { print last ;} }' \
  | tr -d '[]+-' \
  | awk '{ print $1 }' \
  | xargs -I __ echo kill %__

(「エコー」が希望どおりに機能することを確認したら、「エコー」を取り出します...)

7
Olivier Dulac