我知道如何杀死最后一个进程
kill $!
Run Code Online (Sandbox Code Playgroud)
但是我想杀死最后一个进程,即不是最后一个,而是最后一个之前的进程。
我试过
kill $$(($! -1))
Run Code Online (Sandbox Code Playgroud)
但这没有用。
概括:
您应该使用jobsto 列出,并使用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 &
#
Run Code Online (Sandbox Code Playgroud)
请注意查看[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
Run Code Online (Sandbox Code Playgroud)
但是,如果您的 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 %__
Run Code Online (Sandbox Code Playgroud)
(一旦你确定它做了你想要它做的事情,就取出“回声”......)