pgrep이 서브쉘에서 시작된 작업의 하위 항목을 표시할 수 없는 이유가 혼란스럽습니다.

pgrep이 서브쉘에서 시작된 작업의 하위 항목을 표시할 수 없는 이유가 혼란스럽습니다.

작성 중인 스크립트에 korn 쉘을 사용해야 하는데 중첩된 하위 프로세스를 관리하는 데 문제가 발생했습니다. 아래 샘플 코드는 내 문제를 보여줍니다. x초 동안 임시 파일을 만든 다음 삭제하여 작업이 실제로 계속 실행되고 있는지 확인할 수 있습니다. 내부의 배경 하위 쉘 "드라이버 스크립트" 내부 및 외부에서 PIDS 목록을 얻습니다. pgrep두 프로세스 모두 올바른 상위 프로세스 PID를 표시하더라도 외부에서 호출할 때는 찾을 수 없습니다. 내가 이해하지 못하는 것은 무엇입니까? jobs -prpgrep이 작동하지 않는 경우 서브셸 외부에서 실행 중인 작업(bash)의 PID만 가져오도록 어떻게 보장할 수 있나요?

#!/bin/ksh

# create a file for x seconds and then remove it
testfunc() {
    timesec=$1
    touch "${HOME}/testfunc/testfunc_${timesec}.file"
    sleep $timesec && rm -f "${HOME}/testfunc/testfunc_${timesec}.file"
}

# subshell to manage jobs
(

    driver_script_pid="$(exec sh -c 'echo $PPID')"

    for num in 10 35 40 5; do
        testfunc $num &
        echo "child id: $!"
    done

    echo "\$\$ $$"
    echo "subshell: $driver_script_pid"
    echo "children of parent: $(pgrep -P $$)"
    echo "children of subshell: $(pgrep -P $driver_script_pid | tr "\n" " ")"

    for ids in $(jobs -p ); do
        echo "pid: $ids PPID: $(ps -p "$ids" -o ppid=) DONE"
    done

) &

driver_pid=$!

# we still have 10 sec, 35 sec, and 40 sec job still running as verified by the files 
# existing
sleep  6
echo after 6 seconds
echo "spawned driver pid: \"$driver_pid\""
echo child processes:
echo "$(pgrep -P "$driver_pid" | tr "\n" " ")"

이것이 출력입니다. "생성된 드라이버 pid"는 "subshell pid"와 일치하지만, 동일한 pgrep은 백그라운드 프로세스 외부에서 실행될 때 공백으로 나타납니다. 하지만 10번째, 35번째, 45번째 작업에 해당하는 파일은 그대로 남아 있다가 일정 시간이 지나면 삭제되는 것으로 보아 해당 작업이 실행 중인 것으로 알 수 있습니다.

child id: 27195
child id: 27196
child id: 27197
child id: 27199
$$ 27192
subshell: 27193
children of parent: 27193
children of subshell: 27195 27196 27197 27199 27205 
pid: 27199 PPID: 27193 DONE
pid: 27197 PPID: 27193 DONE
pid: 27196 PPID: 27193 DONE
pid: 27195 PPID: 27193 DONE
after 6 seconds
spawned driver pid: "27193"
child processes:

답변1

내 문제는 pgrep과 관련이 없습니다. 문제는 드라이버 스크립트가 하위 항목보다 먼저 종료되므로 모든 연결이 역참조된다는 것입니다. 드라이버에 대기 시간을 추가하면 문제가 해결되었습니다.

관련 정보