2016-09-19 4 views
2

여러 개의 시스템 전체 작업 (예 : 패키지 설치)을 실행하는 대상이있는 Makefile이 있으므로 다른 대상 프로세스가 해당 대상을 기다리는 방식으로 대상을 잠그고, 따라서 병렬 실행을 방지합니다.전체 대상을 Makefile에 잠그기

this answer에서 설명한대로 무리를 사용했지만 메이크 파일의 특수성이 점점 커지고 있다고 생각합니다.

내가 지금 무엇을 가지고 :

LOCKFILE=/var/lock/makefile.lock 
LOCKFD=200 

mytarget: 
    # make sure to release the lock in any case 
    eval "exec $(LOCKFD)>$(LOCKFILE)"; trap "flock -xn $(LOCKFD) && rm -f $(LOCKFILE)" EXIT 
    # get exclusive waiting lock 
    flock -x $(LOCKFD) 
    [regular target operations...] 
    # release lock and delete the lock file 
    flock -u $(LOCKFD); flock -xn $(LOCKFD) && rm -f $(LOCKFILE) 

파일 기술자 (200)가 제대로 설정되지 않기 때문에 그것은이 오류와 함께 실패 다음에 뭔가 문제가있는 것이

$ make mytarget 
# make sure to release the lock in any case 
eval "exec 200>/var/lock/makefile.lock"; trap "flock -xn 200 && rm -f /var/lock/makefile.lock" EXIT 
# get exclusive waiting lock 
flock -x 200 
flock: 200: Bad file descriptor 
Makefile:57: recipe for target 'mytarget' failed 

eval 정의, 그러나 나는 무엇을 보지 못한다.

+0

@shellter 모든 질문에 대한 답변에 설명되어 있습니다. EXIT는 트랩 할 신호의 이름이고,'eval'과 같이 보입니다. 그렇지 않으면'exec'는 fd를 명령으로 해석합니다. – framos

+0

나중에 참조 할 수 있도록 외부 사이트에 대한 링크는 좋은 생각이 아닙니다. 질문은 독립형이어야합니다. 귀하의 정보에 대한 외부 출처가있는 경우이를 포함시킬 수 있지만 관련 사실을 포함하도록 Q를 편집해야합니다. 아래의 답변은 좋아 보인다. 행운을 빕니다. – shellter

+0

잠그면 생각하기가 어렵고 대상이 아무 것도 실행하지 않습니다. 나는 make가 대안을 제공하기 위해 고안된 일을하는 비 (non-make) 방식을 강요하려고 노력하고 있다고 생각합니다. 여기에 잠겨 있어야합니까? 프로세스 A가 프로세스 B에서 "대기"해야 할 때 B가 완료된 후에 대상을 만들고 해당 대상을 A의 종속성으로 만듭니다. – reinierpost

답변

3

Make는 새로운 쉘에서 모든 명령 행을 실행합니다. 네 fd가 eval 후에 사라진 것 같아. 단일 명령 줄을 사용하고 ";"와 명령을 구분할 수 있습니다. 명료하게하기 위해 명령 행을 분할하려면 마지막 행을 제외한 모든 행을 "\"로 끝내야합니다. 자세한 내용은 Splitting Recipe Lines 설명서를 참조하십시오. 또는 쉘 스크립트를 사용하십시오.

+0

답변을 작성해 주셔서 감사합니다. 쉘 스크립트로 모든 것을 추출하는 것이 가장 효과적 일 것이라고 생각합니다. 시도해보고 다시 알려 드리겠습니다. – framos

+0

스크립트에 모든 것을 추출하면 감사합니다. @ rveerd! – framos