일부 하위 프로세스 호출을 단순화하기 위해 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 -p
tail -f /dev/null
kill
답변1
outer &
서브셸을 만듭니다. $!
이 서브쉘의 PID를 제공합니다.
tail -f /dev/null
이 서브쉘의 자식이므로 PID가 다릅니다. 하지만 넌 할 수 있어
exec tail -f /dev/null
대신에. 그런 다음 kill
을 클릭하세요 tail
.
/bin/kill
또 다른 가능성은 내장된 쉘을 대신 사용하는 것입니다 . 인수로 음수를 사용하면 전체 프로세스 그룹을 종료할 수 있습니다.
/bin/kill -TERM -$!