最後のプロセスを終了する方法を知っています。
kill $!
しかし、最後のプロセス、つまり最後のプロセスではなく、最後のプロセスより前のプロセスを終了したいと思います。
頑張った
kill $$(($! -1))
しかし、それはうまくいきませんでした。
答え1
要約:
jobs
usingをリストし、を使用してn番目のバックグラウンドプロセスを終了する必要がありますkill %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 %__
(「エコ」が欲しい効果を出すと確信したら取り出してください…)