bashを使用して(最後 - 1)PIDを終了する方法

bashを使用して(最後 - 1)PIDを終了する方法

最後のプロセスを終了する方法を知っています。

 kill $!

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

頑張った

 kill $$(($! -1))

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

答え1

要約:

jobsusingをリストし、を使用してn番目のバックグラウンドプロセスを終了する必要がありますkill %n。 bashがサポートしている場合、kill %-1n-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(次のプロンプトの前にのみ表示されます)。

これでb​​ashが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 %__

(「エコ」が欲しい効果を出すと確信したら取り出してください…)

関連情報