백그라운드 함수 "$!"의 PID가 잘못된 값을 제공합니다.

백그라운드 함수 "$!"의 PID가 잘못된 값을 제공합니다.

백그라운드에서 실행되는 함수의 PID를 캡처하려고 하는데 숫자가 잘못된 것 같습니다.

다음 스크립트를 참조하세요.

$ cat test1.sh 
#!/bin/bash

set -x

child() {
    echo "Child thinks is $$"
    sleep 5m 
}

child &
child_pid="$!"
echo "Parent thinks pid $child_pid"

sleep 3
kill -- -"$child_pid" # but it is wrong, get "No such process"

kill -- -"$$"
wait

이 함수를 사용하여 상위 프로세스가 하위 프로세스를 종료하기를 원하지만 다음과 같은 결과를 얻습니다.

$ ./test1.sh 
+ child_pid=44551
+ echo 'Parent thinks pid 44551'
Parent thinks pid 44551
+ sleep 3
+ child
+ echo 'Child thinks is 44550'
Child thinks is 44550
+ sleep 5m
+ kill -- -44551
./test1.sh: line 15: kill: (-44551) - No such process
+ kill -- -44550
Terminated

나는 이 질문을 읽었습니다.백그라운드 실행 함수의 PID를 가져옵니다., 그러나 대답은 내가 관찰한 것과 모순되는 것 같습니다.

그렇다면 상위 코드에서 함수의 올바른 PID를 얻으려면 위 코드를 어떻게 수정해야 할까요?


몇 가지 테스트 후에 빼기 기호가 없는 명령이 작동하는 것 같습니다.

kill -- "$child_pid" 

child그러나 이를 종료할 때 해당 하위 프로세스를 종료 하고 싶기 때문에 이것은 내 요구 사항에 충분하지 않습니다 .

답변1

$!올바른 값을 제공하십시오.
$$확실히. $BASHPID대신 사용

바라보다 man bash:

배쉬 PID

현재 bash 프로세스의 프로세스 ID로 확장됩니다. 이는 bash를 다시 초기화할 필요가 없는 하위 쉘과 같은 경우에 따라 $$와 다릅니다. BASHPID 할당은 효과가 없습니다.

kill -- -PID왜 작동하지 않는지 잘 모르겠고 재현할 수 없습니다. 대신 이것을 사용할 수 있습니다 pkill -P PID.

관련 정보