我知道如何杀死最后一个进程
kill $!
但是我想杀死最后一个进程,即不是最后一个进程,而是最后一个进程之前的进程。
我试过
kill $$(($! -1))
但这没有用。
答案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 %__
(一旦你确定“回声”达到了你想要的效果,就将其取出......)