bash는 신호로 인해 자식 프로세스의 비정상 종료시 종료되지 않습니다.

가브리엘

나는 내가 뭘 잘못하고 왜 그랬는지 이해하려고 정말 열심히 노력한다.

launch.sh시작 하는 스크립트가 process.sh있습니다.

launch.sh

#!/bin/bash
while true; do 
./process.sh 
done

process.sh

#!/bin/bash
function signalHandler() {
    for i in {1..2}; do
        sleep 0.1s
        echo "process.sh: cleanup $i"
    done
    exit 130
}

trap "signalHandler" "SIGINT"

while true; do 
sleep 1s
done

내가 달릴 때

./launch.sh &

그리고 그것을 죽여

kill -s SIGINT -$!    

여기서 $!마지막 명령 (launch.sh)의 PID를 가져오고 마이너스는 모든 자식에게 신호를 보낸 다음 launch.sh계속합니다. 왜?


다음 동작을 예상했습니다 (이 블로그 Signal & Bash 에 따르면 ).

launch.sh백그라운드에서 실행중인 스크립트가있는 쉘 A 가 중단되고 Bash는 process.sh완료 될 때까지 기다립니다 . process.sh의 시그널 핸들러로 인해 비정상적으로 리턴 되므로 (exit 130) process.sh, 쉘 A는 종료되어야합니다. 왜 그렇지 않습니까?

이 자식의 상태가 해당 신호로 인해 비정상적으로 종료되었음을 나타내는 경우 쉘은 정리하고 신호 처리기를 제거한 다음 다시 스스로를 죽여 OS 기본 작업 (비정상 종료)을 트리거합니다. 또는 트랩으로 설정된대로 스크립트의 신호 처리기를 실행하고 계속합니다.

무루

첫째, exit 130비정상적인 출구가 아닙니다. 종료 상태가 130 인 정상 종료입니다. man 3 wait(POSIX) 에서 볼 수있는 것처럼 :

   If  the  information  pointed  to  by  stat_loc was stored by a call to
   waitpid()  that  specified  the  WUNTRACED     and  WCONTINUED   flags,
   exactly one of the macros WIFEXITED(*stat_loc), WIFSIGNALED(*stat_loc),
   WIFSTOPPED(*stat_loc),  and WIFCONTINUED(*stat_loc)  shall evaluate  to
   a non-zero value.

WIFEXITED정상적인 종료를 확인 WIFSIGNALLED하고 포착되지 않은 신호로 인해 종료됩니다. 이들은 상호 배타적이므로 an exit 130은 정상입니다.

프로세스가 SIGINT에 의해 죽을 때 종료 상태가 130이라는 것은 bash가 SIGINT로 인해 종료를 감지했기 때문에 프로세스 외부에서 130으로 설정했기 때문입니다. bash 가 $를 설정하는 이유는 무엇입니까? (종료 상태) Ctrl-C 또는 Ctrl-Z에서 0이 아닌 것으로?

둘째, SIGINT를 처리 한 다음 죽는 프로세스는 SIGINT로 스스로를 죽여야합니다. Greg의 위키 (쉘에 대한 훌륭한 리소스)에는 이에 대한 메모가 있습니다 .

EXIT 트랩을 사용하는 대신 SIGINT에 대한 처리기를 설정하기로 선택한 경우 호출자에게 문제가 발생하지 않도록 SIGINT에 대한 응답으로 종료되는 프로세스 가 단순히 종료하는 것이 아니라 SIGINT를 사용 하여 스스로 를 종료해야한다는 점을 알고 있어야 합니다. 그러므로:

trap 'rm -f "$tempfile"; trap - INT; kill -INT $$' INT

이제 다음으로 변경 한 경우 exit 130:

trap - INT
kill -INT $$

예상되는 동작을 볼 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

동시성 과실로 인해 서버가 정상적으로 종료되지 않습니다.

분류에서Dev

시스템 실행 서비스가 종료 / 종료되었는지 여부와 정상적으로 종료되었는지 확인하는 방법은 무엇입니까?

분류에서Dev

프로세스 종료로 인해 서비스가 종료되는 것을 방지하는 방법은 무엇입니까?

분류에서Dev

자식 스레드에 의해 시작된 프로세스를 종료하는 방법은 무엇입니까?

분류에서Dev

자식 스레드에 의해 시작된 프로세스를 종료하는 방법은 무엇입니까?

분류에서Dev

노드 js에서 종료되지 않는 자식 프로세스 생성

분류에서Dev

QProcess는 힙에 정의 된 경우 프로세스를 종료 / 종료하지 않습니다.

분류에서Dev

libc6-dev 재설치 시도 : 하위 프로세스가 신호에 의해 종료되었습니다.

분류에서Dev

Python 하위 프로세스 모듈로 시작된 프로세스는 앱이 종료 될 때 종료되지 않습니다.

분류에서Dev

IntelliJ에서 Android 프로젝트 실행 시도 : 오류 : 비정상적인 빌드 프로세스 종료 : 오류 :이 Java 인스턴스는 32 비트 JVM을 지원하지 않습니다.

분류에서Dev

IntelliJ에서 Android 프로젝트 실행 시도 : 오류 : 비정상적인 빌드 프로세스 종료 : 오류 :이 Java 인스턴스는 32 비트 JVM을 지원하지 않습니다.

분류에서Dev

시스템이 정상적으로 종료되었는지 확인하는 방법은 무엇입니까?

분류에서Dev

Bash는 구문 오류로 종료되지 않습니다.

분류에서Dev

보이지 않는 기본 창 인스턴스로 인해 WPF 앱이 종료되지 않습니다.

분류에서Dev

종료 코드 -1073740791 (0xC0000409) 오류로 인해 웹 사이트를 열지 않는 프로세스가 완료되었습니다.

분류에서Dev

하트 비트 프로세스가 시작하자마자 종료되는 이유는 무엇입니까?

분류에서Dev

고정 된 C # 서비스 자식 프로세스는 종료 할 수 없습니다.

분류에서Dev

ssh를 통해 로그인 한 다른 사용자가있는 경우 종료 / 일시 중지 비활성화

분류에서Dev

QProcess가 종료 코드 1로 즉시 종료되는 사용자 지정 실행 파일 실행

분류에서Dev

bash 및 자식 프로세스 종료

분류에서Dev

EC2 인스턴스는 중지 후 종료되고 자동으로 시작됩니다.

분류에서Dev

SIGTERM으로 종료되는 자식 프로세스 (maxBuffer 초과로 인한 것일 수 있음) 버퍼 문제인지 확인하고 수정하려면 어떻게해야합니까?

분류에서Dev

프로세스가 종료되지 않는 이유와 종료하는 방법

분류에서Dev

.bat-file을 자동 실행하여 컴퓨터가 분리되었는지 확인합니다. 그렇다면 프로세스를 종료하십시오.

분류에서Dev

주석으로 인해 종료되지 않는 입력

분류에서Dev

메인 프로그램을 닫지 않고 Firefox에서 자식 프로세스를 종료하는 방법

분류에서Dev

COM 연결로 시작된 프로세스가 종료되었는지 확인

분류에서Dev

하위 스크립트가 종료 되더라도 상위 bash 스크립트가 종료되지 않는지 확인하십시오.

분류에서Dev

시작 스크립트 오류 : 하위 프로세스가 비정상적으로 종료되었습니다.

Related 관련 기사

  1. 1

    동시성 과실로 인해 서버가 정상적으로 종료되지 않습니다.

  2. 2

    시스템 실행 서비스가 종료 / 종료되었는지 여부와 정상적으로 종료되었는지 확인하는 방법은 무엇입니까?

  3. 3

    프로세스 종료로 인해 서비스가 종료되는 것을 방지하는 방법은 무엇입니까?

  4. 4

    자식 스레드에 의해 시작된 프로세스를 종료하는 방법은 무엇입니까?

  5. 5

    자식 스레드에 의해 시작된 프로세스를 종료하는 방법은 무엇입니까?

  6. 6

    노드 js에서 종료되지 않는 자식 프로세스 생성

  7. 7

    QProcess는 힙에 정의 된 경우 프로세스를 종료 / 종료하지 않습니다.

  8. 8

    libc6-dev 재설치 시도 : 하위 프로세스가 신호에 의해 종료되었습니다.

  9. 9

    Python 하위 프로세스 모듈로 시작된 프로세스는 앱이 종료 될 때 종료되지 않습니다.

  10. 10

    IntelliJ에서 Android 프로젝트 실행 시도 : 오류 : 비정상적인 빌드 프로세스 종료 : 오류 :이 Java 인스턴스는 32 비트 JVM을 지원하지 않습니다.

  11. 11

    IntelliJ에서 Android 프로젝트 실행 시도 : 오류 : 비정상적인 빌드 프로세스 종료 : 오류 :이 Java 인스턴스는 32 비트 JVM을 지원하지 않습니다.

  12. 12

    시스템이 정상적으로 종료되었는지 확인하는 방법은 무엇입니까?

  13. 13

    Bash는 구문 오류로 종료되지 않습니다.

  14. 14

    보이지 않는 기본 창 인스턴스로 인해 WPF 앱이 종료되지 않습니다.

  15. 15

    종료 코드 -1073740791 (0xC0000409) 오류로 인해 웹 사이트를 열지 않는 프로세스가 완료되었습니다.

  16. 16

    하트 비트 프로세스가 시작하자마자 종료되는 이유는 무엇입니까?

  17. 17

    고정 된 C # 서비스 자식 프로세스는 종료 할 수 없습니다.

  18. 18

    ssh를 통해 로그인 한 다른 사용자가있는 경우 종료 / 일시 중지 비활성화

  19. 19

    QProcess가 종료 코드 1로 즉시 종료되는 사용자 지정 실행 파일 실행

  20. 20

    bash 및 자식 프로세스 종료

  21. 21

    EC2 인스턴스는 중지 후 종료되고 자동으로 시작됩니다.

  22. 22

    SIGTERM으로 종료되는 자식 프로세스 (maxBuffer 초과로 인한 것일 수 있음) 버퍼 문제인지 확인하고 수정하려면 어떻게해야합니까?

  23. 23

    프로세스가 종료되지 않는 이유와 종료하는 방법

  24. 24

    .bat-file을 자동 실행하여 컴퓨터가 분리되었는지 확인합니다. 그렇다면 프로세스를 종료하십시오.

  25. 25

    주석으로 인해 종료되지 않는 입력

  26. 26

    메인 프로그램을 닫지 않고 Firefox에서 자식 프로세스를 종료하는 방법

  27. 27

    COM 연결로 시작된 프로세스가 종료되었는지 확인

  28. 28

    하위 스크립트가 종료 되더라도 상위 bash 스크립트가 종료되지 않는지 확인하십시오.

  29. 29

    시작 스크립트 오류 : 하위 프로세스가 비정상적으로 종료되었습니다.

뜨겁다태그

보관