$!를 병렬로 실행되는 스크립트에 사용하면 경쟁 조건이 발생할 수 있나요?

$!를 병렬로 실행되는 스크립트에 사용하면 경쟁 조건이 발생할 수 있나요?

여러 개의 bash 스크립트가 병렬로 실행되고 있다고 가정하면 코드는 다음과 같습니다.

#!/bin/bash

tail -f /dev/null &
echo "pid is "$!

$!가장 최근 백그라운드 작업의 PID 제공 보장그 스크립트에서, 아니면 세계 최신 백그라운드 작업인가요? 반환되는 PID가 다른 스크립트에서 시작된 프로세스에서 나온 경우 이 기능을 사용하면 경쟁 조건이 발생할 수 있는지 궁금합니다.

답변1

$!명령을 실행하는 쉘 프로세스의 pid를 제공할 것을 보장합니다 tail. 쉘은 단일 스레드이며 각 쉘은 자체 프로세스에 존재하며 자체 변수 세트를 가지고 있습니다. $!껍질은 불가능하다방법을 제공한 쉘에 쉘 변수를 할당하는 것과 마찬가지로 다른 쉘에 할당해도 다른 쉘에 있는 동일한 이름의 변수에는 영향을 미치지 않습니다.범용 변수껍데기 fish).

이제 tail -f /dev/null이것은 무기한 실행되는 명령이지만 수명이 짧은 명령의 경우 가능한 프로세스 ID 수가 제한되어 있으므로 프로세스 ID가 필연적으로 재사용됩니다.

존재하다:

true &
pid=$!

여기에는 $pid쉘이 실행 중인 프로세스의 ID가 포함 되지만 true이를 사용할 때쯤에는 $pid해당 PID가 종료될 가능성이 높으며 다른 프로세스를 참조할 수 있습니다.

관련 정보