서브셸에서 작업을 종료하려면 set -m을 사용하세요.

서브셸에서 작업을 종료하려면 set -m을 사용하세요.

다음 bash 스크립트가 있습니다.

#!/bin/bash
set -m
(
    (bin/pnvd &> /dev/null; kill 0) &
    sleep 2
    perl integration-test/fuzz-test.pl || kill 0
    kill %1
)

서브셸의 처음 세 명령은 성공하고 종료 상태 0을 반환합니다. bin/pnvd외부적으로 종료될 때까지 종료하지 마십시오.

그러나 하위 셸에서 네 번째 명령을 실행한 후 스크립트는 다음 출력과 함께 종료됩니다.

도구/통합 테스트: 8행: 4712로 종료((bin/pnvd &> /dev/null; kill 0) & sleep 2; perl Integration-tests/fuzz-test.pl || kill 0; kill %1)

상태 코드 143.

첫 번째 작업뿐만 아니라 전체 프로세스 그룹을 종료하는 것처럼 보이지만 kill %1삭제하면 set -m상태 0으로 종료됩니다.

나는별로 관심이 없다어떻게이 문제를 해결하세요.서브셸이 첫 번째 작업을 종료하면 상태 143으로 종료됩니까?

답변1

에서 인용https://stackoverflow.com/a/7294947/402322

또한 신호로 인해 프로그램이 종료되면 bash는 종료 상태를 다음과 같이 인코딩합니다.

128 + signal-number

따라서 SIGHUP은 129를 생성하고 SIGILL은 132를 생성하며 SIGTERM은 143을 생성하는 식입니다.

위의 내용은 프로세스가 SIGTERM을 수신했음을 의미합니다.

코드에는 세 개의 가 있습니다 kill. kill %1다른 두 개 중 하나를 제외할 수 있으면 kill 0TERM 신호가 전송됩니다.

관련 정보