bash: 하위 프로세스가 실패하면 상위 프로세스의 PID를 가져오지 마세요.

bash: 하위 프로세스가 실패하면 상위 프로세스의 PID를 가져오지 마세요.

(원제 - bash: 백그라운드에서 명령 실행 및 pid 캡처)

$!이것은 하위 프로세스 시작 실패(예: "명령을 찾을 수 없음"으로 인해)가 호출 프로세스의 pid에 설정을 남길 수 있는 bash의 예기치 않은 동작을 다루기 때문에 다른 질문의 [중복]이 아닙니다. 하위 프로세스 pid 또는 ""(null)이 실패하는 것보다. ——문서 회수

bash 4.1 스크립트를 작성 중입니다...

  • 백그라운드에서 다른 스크립트(또는 내부 기능)를 실행하고 싶습니다...
  • 그리고 포그라운드 스크립트의 변수에서 백그라운드 작업의 pid를 캡처합니다...
  • 작업이 시작되지 않은 경우 변수는 비어 있어야 합니다(예: "").

백그라운드 작업이 항상 시작되면 두 방법 모두 작동합니다.

cmd &
VAR=$!

or...

( cmd & ); VAR=$!

실행 하면 cmd마지막 명령으로 시작된 pid($!)가 우리가 원하는 것이 되며 $VAR이 정확합니다.

그러나 cmd시작되지 않은 경우 $VAR은 마지막 명령의 pid가 됩니다.그것 앞에시작되는 것은 전경 스크립트 자체의 pid일 수 있습니다. 나중에 특정 조건에서 프로세스를 종료하려면 pid가 필요하기 때문에 cmd잘못된 pid를 가져오는 것이 작동하지 않을 수도 있습니다.

정말 필요한 것은 백그라운드 작업이 실행 중일 때만 VAR을 변경하는 것입니다. 문법 오류같은거..

VAR=
( cmd & );  && VAR=$!

구현된 솔루션

이 의견과 Joseph R의 답변은 매우 도움이 됩니다. 비슷한 문제를 겪고 있는 분들을 위해...

다음 bash 함수는 standby백그라운드에서 GtkDialog 스크립트를 실행합니다. 하위 프로세스에서 자체적으로 실행되는 함수 내부에서는 standby실패 시 스크립트의 PID 대신 호출 스크립트의 PID를 가져오는 것을 방지하는 데 필요한 격리를 제공하는 것 같습니다 standby.

function standbyBg () {
  ifHelpShow "$1" 'standbyBg
    Run standby (busy "throbber") in background and echo its pid.
    Example:
        standbyPID=$(standbyBg)
    Revised:
        20131123 docsalvager'  && return
  #
  standby  >/dev/null 2>&1  &
  echo $!
}

답변1

약간의 해킹된 솔루션:

jobs &>/dev/null
cmd &
new_job_started="$(jobs -n)"
if [ -n "$new_job_started" ];then
    VAR=$!
else
    VAR=
fi

내 관심을 끌었던 그의 의견에 대해 @terdon에게 감사드립니다 help jobs.

관련 정보