私は最後のプロセスを殺す方法を知っています
kill $!
ただし、最後の1つのプロセス、つまり最後のプロセスではなく、最後のプロセスの前のプロセスを強制終了したいと思います。
私は試した
kill $$(($! -1))
しかし、それはうまくいきませんでした。
概要:
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 %__
(「エコー」が希望どおりに機能することを確認したら、「エコー」を取り出します...)