문제

구현할 수 있는 방법이 있는지 궁금합니다. trap GNU에서 make, 내장된 것과 유사 BASH?

사용자가 누르면 CTRL-C, 또는 만약 make 자체적으로 실패하면(0이 아닌 종료) 특정 대상이나 매크로를 호출하고 싶습니다.

도움이 되었습니까?

해결책

아니요. GNU Make의 신호 처리는 이미 원하는 것이 많습니다. 신호 핸들러 내에서 다음과 같은 기능을 호출합니다. printf 신호 핸들러 내에서 호출되는 것이 안전하지 않습니다. 예를 들어이 원인 문제를 보았습니다 .DELETE_ON_ERROR 규칙이 항상 실행되는 것은 아닙니다 stderr 리디렉션됩니다 stdout.

예를 들어 Centos 7.4 상자에서 :

  1. 다음을 만듭니다 Makefile:

    .DELETE_ON_ERROR:
    
    foo:
            touch $@
            sleep 10
    
  2. 그것을 열어 vim 그리고 달리기 :make,

  3. 자고있는 동안, 맞습니다 Ctrl 키-

vim/인쇄물을 만듭니다

Press ENTER or type command to continue
touch foo
sleep 10
^C
shell returned 130

Interrupt: Press ENTER or type command to continue

Make는 인터럽트 신호를 보냈지 만 foo 여전히 존재합니다.

다른 팁

이 시점에서 GNU는 기본 지원이 없습니다.

그러나 신뢰할 수있는 해결 방법이 있습니다.

.PHONY: internal-target external-target

external-target:
  bash -c "trap 'trap - SIGINT SIGTERM ERR; <DO CLEANUP HERE>; exit 1' SIGINT SIGTERM ERR; $(MAKE) internal-target"

internal-target:
  echo "doing stuff here"

이것은 중단, 종단 및 0이 아닌 출구 코드를 포착합니다.

참고 $(MAKE) 따라서 cmdline은 재정의하고 옵션을 전달하여 잠수하게합니다.

함정 :

  • 클리어 트랩 핸들러 ( -)
  • 정리하십시오
  • 0이 아닌 출구 상태로 종료하므로 구축 자동화 도구가 실패한 빌드를보고하십시오.

delete_on_error는 디렉토리에 대해서는 작동하지 않으므로 이후 청소의 핵심입니다. mktemp -d, 예를 들어

바꾸다 <DO CLEANUP HERE> 유효한 CMD.

기본 사례에 충분해 보이는 @kevinf 답변의 단순화된 버전입니다.

run:
    bash -c "trap 'docker-compose down' EXIT; docker-compose up --build"

(이 예는 이유가 있습니다: docker-compose up 말한다

언제 명령이 종료되고 모든 컨테이너가 중지됩니다.

하지만 그렇지 않다 rm 정지된 컨테이너 docker run --rm 그러면 계속해서 볼 수 있습니다. docker ps -a.)

Make는 그것을 지원하지 않지만 Bash 트릭을 사용하면 비슷한 것을 달성 할 수 있습니다.

default: complete

complete: do_mount
        echo "Do something here..."

do_mount:
        mkdir -p "$(MOUNTPOINT)"
        ( while ps -p $$PPID >/dev/null ; do \
                sleep 1 ; \
        done ; \
        unmount "$(MOUNTPOINT)" \
        ) &
        mount "$(MOUNTSOURCE)" "$(MOUNTPOINT)" -o bind

"Unmount"는 "Make"가 완료된 후에 실행됩니다. 이는 일반적으로 빌드 중에 발생할 수 있지만 "Make"출구에서 정상적으로 정리되지 않는 작업을 정리하려고 시도하는 경우 일반적으로 만족스러운 솔루션입니다.

아닙니다. 내가 아는 한 그러한 기능은 없다.

반환 코드를 생산합니다. 내가 지금 기억할 수있는 한, 성공을 위해 0, 실패로 2를 반환합니다 (문서를 확인하십시오). 따라서 예를 들어 쉘 스크립트 내부를 랩핑하기에 충분합니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top