쉘 스크립트의 `:&`

쉘 스크립트의 `:&`

Ethan의 쉘 스크립트를 이해하려고 노력 중입니다.이 게시물, 운영 체제에서 최대 및 최소 프로세스 ID를 검색하는 데 사용됩니다.

pid=0
for i in {1..100000}; do
  : &
  if [ $! -lt $pid ]; then
    echo "Min pid: $!"
    echo "Max pid: $pid"
    break
  fi
  pid=$!
done

나는 그것이 $쉘 매개변수를 대체한다는 것을 알고 !있으며범위"가장 최근에 실행된 백그라운드(비동기) 명령"의 PID를 저장합니다. 게다가, &그것은제어 연산자명령 끝에 사용될 때: 백그라운드 프로세스에서 앞에 오는 모든 것을 호출합니다. 따라서 새 셸 인스턴스를 열고 를 실행한 : &다음 실행하면 다음과 같은 결과를 $!얻을 수 있습니다.

% : &
[1] <PID>
[1]  + done       : 
% $!
<PID>

각 통화의 위치는 <PID>다릅니다. if [ $! -lt $pid ]; then효과 는 무엇입니까 ? 스크립트가 가장 작은 PID에서 가장 큰 PID(즉, 일관된 출력 합계 100) 로 성공적으로 변경되는 이유는 무엇입니까 99998? 결승전은 무엇을 pid=$!위한 것인가? 카운터가 i스크립트에서 어디에 표시됩니까(100,000회 반복 외에)?

답변1

i운영 체제 범위 내에서 가능한 모든 PID를 시도하기에 충분한 프로세스를 실행하는 데에만 유용합니다(일부 운영 체제에서는 더 큰 PID 범위를 허용함). 이는 시작 이후 실행 중인 프로세스 수에 따라 이 범위 내의 모든 지점에서 시작됩니다.

: &아무 작업도 수행하지 않는 명령을 실행하지만 고유한 PID가 할당됩니다(어쨌든 시작 시 고유함).

스크립트는 운영 체제가 숫자 순서대로 PID를 할당하고 사용 중인 PID를 건너뛴다고 가정합니다. 이는 Linux(기본값)를 포함하여 작동하는 Unix 계열 운영 체제의 수입니다. 또한 스크립트는 최대 프로세스 ID가 100000 미만이라고 가정합니다. 이는 Linux(15비트 PID)에서는 해당되지만 최신 Linux 시스템에서는 그렇지 않습니다.

PID가 지금까지 본 최고 값보다 큰 한 새로운 최고 값을 저장하고 계속 진행합니다.

운영 체제에 PID가 부족해지면 예약된 범위보다 높고 현재 사용되지 않는 가장 낮은 PID로 루프를 시작합니다.

이런 일이 처음 발생하면 방금 얻은 낮은 PID와 종료하기 전에 가장 높은 PID를 보고하고 완료됩니다.

Linux는 모든 작업 제어 메시지(수천 개)를 터미널로 보냅니다. 마지막 줄을 다음으로 변경하여 전체 stdout 출력을 리디렉션했습니다.

done > /dev/null

그리고 stderr로 가는 두 개의 에코를 다음으로 바꾸세요.

printf 1>&2 'Pid range: min %d, max %d\n' $! $pid

관련 정보