如何用 bash 杀死(最后一个 - 1)PID

mus*_*sme 3 bash process kill

我知道如何杀死最后一个进程

 kill $!
Run Code Online (Sandbox Code Playgroud)

但是我想杀死最后一个进程,即不是最后一个,而是最后一个之前的进程。

我试过

 kill $$(($! -1))
Run Code Online (Sandbox Code Playgroud)

但这没有用。

Oli*_*lac 8

概括:

您应该使用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)

(一旦你确定它做了你想要它做的事情,就取出“回声”......)