함수 내에서 시작된 작업 종료

함수 내에서 시작된 작업 종료

일부 하위 프로세스 호출을 단순화하기 위해 bash 스크립트에서 일부 기능을 사용하려고 합니다. 프로세스를 백그라운드에서 작업으로 실행할지 포그라운드에서 작업으로 실행할지 호출 사이트에서 결정하고 필요한 경우 하위 프로세스를 종료하고 싶습니다. 불행히도 내가 아는 한 내가 얻은 pid는 $!장기 실행 백그라운드 프로세스에 속하지 않고 이를 호출한 함수에 속합니다. 내가 $를 사용하여 얻은 pid를 죽여라!! 장기 실행 하위 프로세스는 종료되지 않으며 고아인 것처럼 보입니다.

function inner() {
  tail -f /dev/null
}

function outer() {
  inner
}

outer &
echo 'Before, $!: ' $!
echo 'Before, jobs -p: ' $(jobs -p)
echo 'Before, ps aux: ' $(ps aux | grep /dev/null | grep -v grep)

kill $!
echo 'After, $!: ' $!
echo 'After, jobs -p: ' $(jobs -p)
echo 'After, ps aux: ' $(ps aux | grep /dev/null | grep -v grep)

내가 얻는 결과는 다음과 같습니다.

Before, $!:  71644
Before, jobs -p:  71644
Before, ps aux:  jstaab 71646 0.0 0.0 4267744 688 s005 S+ 2:53PM 0:00.00 tail -f /dev/null
After, $!:  71644
After, jobs -p:  71644
./test.sh: line 17: 71644 Terminated: 15          outer
After, ps aux:  jstaab 71646 0.4 0.0 4267744 688 s005 S+ 2:53PM 0:00.00 tail -f /dev/null

이것이 나에게 와 다른 pid를 ps aux제공한다는 것을 알 수 있습니다 . 이것은 의미가 있지만 grep 명령 없이 어떻게 죽일 수 있습니까?$!jobs -ptail -f /dev/nullkill

답변1

outer &서브셸을 만듭니다. $!이 서브쉘의 PID를 제공합니다.

tail -f /dev/null이 서브쉘의 자식이므로 PID가 다릅니다. 하지만 넌 할 수 있어

exec tail -f /dev/null

대신에. 그런 다음 kill을 클릭하세요 tail.

/bin/kill또 다른 가능성은 내장된 쉘을 대신 사용하는 것입니다 . 인수로 음수를 사용하면 전체 프로세스 그룹을 종료할 수 있습니다.

/bin/kill -TERM -$!

관련 정보