"$!"는 "&"를 사용하여 올바른 ID를 안정적으로 반환합니까?

"$!"는 "&"를 사용하여 올바른 ID를 안정적으로 반환합니까?

내 테스트에서는 지금까지 항상 올바른 결과를 얻었습니다.

[fabian@manjaro ~]$ sleep 10 & echo $!
[1] 302657
302657

하지만 sleepthe 와 echohere 가 동시에 실행되기 때문에 가끔 echo정확하게 설정된 값보다 먼저 실행되는 경우가 있을 것으로 예상됩니다. $!이런 일이 일어날까요? 지금까지 왜 효과가 없었나요?

나의 궁극적인 목표는 두 작업을 병렬로 실행한 다음 계속하기 전에 두 작업을 모두 기다리는 것입니다. 현재 계획은 비슷한 것을 사용하는 것입니다 foo & bar; wait $!; baz. 이것이 항상 작동합니까, 아니면 때때로 임의의 이전 백그라운드 프로세스를 기다릴 수 있습니까(또는 비어 있으면 전혀 기다리지 않을 수 있습니까 $!)?

답변1

그래서

sleep 10 & echo $!

명령이 두 개야

sleep 10 & 
echo $!

그들이 같은 페이지에 있다는 것은 그것을 바꾸지 않습니다.

따라서 쉘은 fork()새 프로세스를 생성하고 새 프로세스의 프로세스 ID를 $!. 그런 다음 새 프로세스가 실행되고 sleep다른 프로세스가 실행됩니다 echo.

$!따라서 프로세스가 실패하더라도 새 프로세스의 PID가 항상 유지되도록 할 수 있습니다 fork().

답변2

이 목표를 달성하려면:

나의 궁극적인 목표는 두 작업을 병렬로 실행한 다음 계속하기 전에 두 작업을 모두 기다리는 것입니다.

이 두 명령을 background()로 보내는 스크립트에 포함하면 즉시 시작되어 병렬로 실행될 수 있으며, 해당 pid를 캡처하고 명시적으로 기다릴 필요가 없습니다 &.wait

task1 &
task2 &
wait
echo both tasks finished

posix 매뉴얼에서 wait:

대기 유틸리티가 피연산자 없이 호출되면 호출 셸에 알려진 모든 프로세스 ID가 종료되고 0 종료 상태로 종료될 때까지 기다립니다.

관련 정보