bash를 사용하여 (마지막 - 1) PID를 종료하는 방법

bash를 사용하여 (마지막 - 1) PID를 종료하는 방법

마지막 프로세스를 종료하는 방법을 알고 있습니다.

 kill $!

하지만 마지막 프로세스, 즉 마지막 프로세스가 아니라 마지막 프로세스 이전의 프로세스를 종료하고 싶습니다.

나는 노력했다

 kill $$(($! -1))

그러나 그것은 작동하지 않았습니다.

답변1

요약:

jobsusing 을 나열하고 를 사용하여 n번째 백그라운드 프로세스를 종료 해야 합니다 kill %n. bash가 지원하는 경우 kill %-1n-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 %__

("에코"가 원하는 효과를 낸다고 확신하면 꺼내세요...)

관련 정보