시작 전 또는 완료 후 하위 프로세스의 PID를 검색합니다.

시작 전 또는 완료 후 하위 프로세스의 PID를 검색합니다.

나는 프로그램을 시작하기 위해 쉘 스크립트를 작성했습니다 ${programName}.

<workFolderLocation>/SAS_work<randomHex>00<pidHex>_<server>프로그램은 프로그램 pidHex의 16진수 표현이 있는 폴더에 임시 작업 파일을 생성합니다 . PID일반적으로 이 임시 폴더는 프로그램이 완료되면 사라집니다.

프로그램은 또한 쉘 스크립트의 내용을 ${logFolder}/${programName}_$$.log포함하도록 이름을 지정한 로그 파일을 생성합니다.PID

불행히도 이러한 PID는 동일하지 않으므로 프로그램이 작업 폴더를 정리하지 않으면 작업 폴더에 해당하는 로그를 쉽게 찾을 수 없습니다.

(로그 파일의 pid를 보고 awk스크립트에서 로그 파일의 이름을 변경하여 이 문제를 해결한 적이 있지만 불행하게도 로그가 변경되어 더 이상 pid가 포함되지 않습니다.)

Stéphane Chazelas에 대한 편집자 답변

실제로 로그는 프로그램의 표준 출력입니다. 로그 이름은 매개변수 중 하나입니다.

또한 프로그램이 반환 코드 1로 끝나는 경우 스크립트는 작업 예약 시스템에 오류가 기록되지 않도록 반환 코드 0으로 끝나야 합니다.

따라서 스크립트는 현재 다음과 같습니다.

programName=<some calculation>
otherArguments=<other calculation>

"${programName}" -log "$logFolder/${programName}_$$.log" "${otherArguments}"
rc=$?
if [ $rc -eq 1 ]; then
        exit 0
else
        exit $rc
fi

나중에 반환 코드를 처리할 수 있나요?

exec "${programName}" -log "$logFolder/${programName}_$$.log" "${otherArguments}"

답변1

당신이 달리면

exec "$programName" > "$logFolder/${programName}_$$.log" 2>&1

그런 다음 프로그램은 동일한 프로세스에서 실행됩니다 $$.

이는 분명히 쉘 스크립트가 수행해야 하는 마지막 작업입니다.

스크립트가 나중에 다른 작업을 수행해야 하는 경우 새 sh프로세스를 시작하여 리디렉션을 수행하고 동일한 프로세스에서 프로그램을 실행할 수 있습니다.

LOGPREFIX="$logFolder/$programName" sh -c '
  exec "$0" "$@" > "${LOGPREFIX}_$$.log" 2>&1
  ' "$progName" and some extra arguments if needed

printf>&2 '%s\n' "$progName terminated with $? exit status"

do-more-stuff-after-the-program-has-returned

또는 스크립트의 나머지 부분이 프로그램의 pid를 사용하여 작업을 수행해야 하는 경우:

LOGPREFIX=$logFolder/$programName sh -c '
  exec "$0" "$@" > "${LOGPREFIX}_$$.log" 2>&1
  ' "$progName" and some args if needed &

pid="$!"
printf>&2 '%s\n' "$progName was started asynchronously with pid $pid"
wait "$pid"
exit_status="$?"
printf>&2 '%s\n' "$progName terminated with exit status $exit_status"

대부분의 셸에서 명령을 비동기적으로 시작하면 표준 입력이 /dev/null로 리디렉션되는 부작용이 있습니다.

관련 정보