나는 프로그램을 시작하기 위해 쉘 스크립트를 작성했습니다 ${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로 리디렉션되는 부작용이 있습니다.