2016-12-22 3 views
1

우리는 많은 젠킨스 프로젝트를 병렬로 운영하고 있습니다. 우리는 python을 사용하고 있으며 pyenv를 사용하여 가상 환경을 관리하도록 선택했습니다. 불행히도 pyenv는 잘 알려진 race condition입니다. 문제를 해결하려면 프로세스 수준에서 잠금을 구현하고 싶습니다. 내가 원하는 것은 :다중 프로세스 시스템에서 잠금을 구현하는 방법은 무엇입니까?

lock some resource (a file?) 
do my pyenv stuff 
unlock the resource 

내 스크립트는 bash로 작성되었습니다. 어떻게 bash에서 리소스 잠금/잠금 해제를 구현할 수 있습니까?

답변

1

일반 파일 대신에 심볼릭 링크를 사용하는 것을 고려할 것입니다. 왜냐하면 심볼릭 링크 생성은 원자 적 연산이기 때문입니다. 그래서, 우리는이 작업을 수행 할 수 있습니다 :

lockfile=/path/to/lock.file 
# lockfile is a symlink that points the string that holds the PID of the locking process 
ln -s $$ $lockfile 2>/dev/null 
if [[ $? == 0 ]]; then 
    # got the lock - ln -s will fail if symlink exists already 
else 
    otherprocess=$(readlink $lockfile) 
    if [[ $otherprocess != $$ ]]; then 
     ps -p $otherprocess 2>/dev/null 
     if [[ $? != 0 ]]; then 
      # stale lock; remove and lock again 
      # this can result in race conditions 
      # probably, we can make the lock procedure as a function that is shared by concurrent bash scripts and have a random sleep before we remove the stale lock and proceed 
     fi 
    fi 
fi 
+1

좋지만 너무 특별합니다. 이미 존재하는 명령이있는 것 같습니다 : flock – dangonfast

+0

@delavnog : 잠금을 위해 심볼릭 링크를 사용하여 구현을 보았습니다. 그러나 나는 무리가 낫다는 데 동의한다. – codeforester

2

그래서 프로세스 간 잠금을 원하는 것은 flock라는 명령은 유닉스 세계에서 당신의 친구. 그것은 OS 레벨에서 원자 적 연산으로 구현되며 이런 종류의 일에 매우 유용합니다. more about it here을 읽을 수 있습니다. 여기 당신이 그것을 사용하는 방법입니다 : 몇 가지 트릭이 여기에있다

# Wait for lock on (fd 222) for 10 seconds 
    (flock -w 10 222 || exit 1 

    { 
     # Do the operations you want to here 
    }) 222>/path/to/lockfile 

. 첫째, 일반적으로 출력 리다이렉션을 사용할 때 bash는 파일을 열기 전에 먼저 파일을 엽니 다. 여기에 우리가 ()을 가지고 있기 때문에 bash는 첫 번째 명령이 무리 인 서브 쉘을 먼저 시작합니다. flock은 파일 핸들 222에 대한 잠금을 얻으려고 시도합니다. Flock은 파일 설명자를 잠급니다. 파일 설명자를 잠그면 {}의 코드가 실행됩니다. 실행 후, 파일 기술자 (222)의 내용이 잠금 파일에 기록되고 (즉, 아무것도), 파일이 닫히고 잠금이 해제된다. 이것은 파일을 닫으면 잠금을 해제하는 C와 같습니다. 물론 here에 대해 설명하는 유명한 @CharlesDuffy (모자 팁 @codeforester)보다 더 잘 설명 할 수는 없습니다.

+0

니스. 왜 중괄호? – dangonfast

+0

특별한 이유는 없습니다. 난 그냥 실제 작업을하고있는 코드에서 자물쇠를하고 코드를 분리하는 데 거기처럼 그들처럼. – 2ps

+0

@ 2ps : 코드를 실행하는 동안 구문 오류가 발생합니다. – codeforester