2017-10-22 8 views
1

flock을 사용하여 한 번에 하나의 스크립트 인스턴스 만 실행할 수 있습니다. 대부분의 경우이 기능이 정상적으로 작동하는 것 같습니다. 하지만 로그 아웃 (i3wm을 사용)하거나 PC가 재부팅되면 잠금 장치가 해제되지 않습니다. 다음 로그인시에는 잠금 파일이 계속 존재하며 새 잠금을 확보 할 수 없으므로 스크립트가 시작되지 않습니다.로그 아웃/재부팅시 flock이 해제되지 않음

자세히 알 수 있듯이 프로세스 종료시 잠금을 해제하기 위해 이미 trap을 시도했지만 도움이되지 않습니다.

flock을 잘못 사용하고 있습니까? 아니면 다른 것이 누락 되었습니까? 프로세스가 끝나면 잠금이 해제되어야한다는 인상 아래에서 로그 아웃/재부팅이 포함되어야합니다.

LOCK_FILE="${HOME}/.my_script.lock" 

release_lock() { 
    # This shouldn't be necessary but it seems 
    # the lock doesn't release on i3 exit 
    rm "${LOCK_FILE}" 
} 


(
    if [[ -n $LOGFILE ]]; then 
     exec >>"$LOGFILE" 2>&1 
    fi 

    flock -xn 200 || { show_message "$(basename ${0}): cannot acquire lock ${LOCK_FILE}"; exit 3; } 
    trap release_lock EXIT 

    # Call the main function (not included in this snippet) 
    main 200>&- 
) 200>"${LOCK_FILE}" 

답변

2

파일을 제거하지 마십시오. 그냥 파일을 열어 놓은 프로세스가 종료되도록하십시오.

(
    if [[ -n $LOGFILE ]]; then 
     exec >>"$LOGFILE" 2>&1 
    fi 

    flock -xn 200 || { show_message "$(basename ${0}): cannot acquire lock ${LOCK_FILE}"; exit 3; } 

    main 
) 200>"${LOCK_FILE}" 

main이 존재

, $LOCK_FILE뿐만 아니라 종료됩니다 및 잠금이 삭제됩니다 열린 서브 쉘.

잠금을 명시 적으로 해제하려면 파일을 제거하는 대신 flock --unlock 200을 사용하십시오.

+0

답변 주셔서 감사합니다. 실제로 로그 아웃시 잠금을 해제하려면 trap/release_lock이 필요합니다. 그러나 '--unlock'을 사용하면 잠금이 올바르게 relate됩니다. 이 질문을 "대답"으로 설정하기 전에 테스트 해 볼 것입니다. – rje