여러 개의 시스템 전체 작업 (예 : 패키지 설치)을 실행하는 대상이있는 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
정의, 그러나 나는 무엇을 보지 못한다.
@shellter 모든 질문에 대한 답변에 설명되어 있습니다. EXIT는 트랩 할 신호의 이름이고,'eval'과 같이 보입니다. 그렇지 않으면'exec'는 fd를 명령으로 해석합니다. – framos
나중에 참조 할 수 있도록 외부 사이트에 대한 링크는 좋은 생각이 아닙니다. 질문은 독립형이어야합니다. 귀하의 정보에 대한 외부 출처가있는 경우이를 포함시킬 수 있지만 관련 사실을 포함하도록 Q를 편집해야합니다. 아래의 답변은 좋아 보인다. 행운을 빕니다. – shellter
잠그면 생각하기가 어렵고 대상이 아무 것도 실행하지 않습니다. 나는 make가 대안을 제공하기 위해 고안된 일을하는 비 (non-make) 방식을 강요하려고 노력하고 있다고 생각합니다. 여기에 잠겨 있어야합니까? 프로세스 A가 프로세스 B에서 "대기"해야 할 때 B가 완료된 후에 대상을 만들고 해당 대상을 A의 종속성으로 만듭니다. – reinierpost