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

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

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

 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 %__

(一旦你确定“回声”达到了你想要的效果,就将其取出......)

相关内容