(원제 - 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
.