flock 예제

아래에서 POSIX 및 Linux에서 사용할 수 있는 모든 잠금 유형에 대해 설명하고 사용 예제를 제공합니다. flock (2) 그것은 열려있는 파일에 자문 잠금을 적용하는 데 사용됩니다. 여러 실행 중인 프로세스에서 리소스에 대한 액세스를 동기화하는 데 사용할 수 있습니다. Flock(2)은 파일(실제로 파일 핸들)에서만 작동하지만 파일 자체는 액세스가 제어되는 리소스일 필요는 없습니다. 대신 이 파일을 세마포어로 사용하여 동시성 문제 없이 모든 리소스에 액세스할 수 있는 중요한 섹션에 대한 액세스를 제어할 수 있습니다. 포크()를 통해 „무리“를 실행하는 것은 문제가되지 않습니다. Flock() 맨 페이지는 다음과 같습니다: 해결책은 거의 정확했습니다. 무리는 부모 쉘에서 fd를 사용하지 않습니다. 따라서 명령에서 무리를 속여야 합니다. dupe없이, 당신은 무리에서 나쁜 파일 설명자 경고를 받아야한다. ksh, bash 등 : 다음은 대부분의 sh 맛과 함께 작동합니다. 나는 무리 1 1>&9를 사용하여 실행 내의 파일 설명자 간의 차이를 보여줍니다. 그것은 추적의 용이성을 위해 무리 -n 9 99>&9와 함께 잘 작동합니다.

다음 예제에서는 셸 세션을 사용하여 스크립트를 동시에 실행하거나 시작/중지에서 서로 다른 오프셋을 사용합니다. 배쉬는 ksh로 대체 될 수 있습니다. http://blog.sam.liddicott.com/2016/02/using-flock-in-bash-without-invoking.html 아래는 필수 잠금의 사용 예를 찾을 수 있습니다. 나는 최근에 무리를 발견하고 시스템이 부팅하고 스크립트에서 많은 iptables 규칙을 실행 할 때마다 그것을 사용합니다. iptables는 잠금 기능이없는 것처럼 보이므로 일부 iptables 규칙이 전혀로드되지 않습니다. 명령 무리와 함께 사용할 수 있는 주요 옵션은 다음과 같습니다: bash에서 파일 설명자를 열고 수동으로 잠금을 획득하고 해제하기 위해 무리를 사용합니다: IPT=`flock/dev/shm/iptables.lock iptables` bash -x /tmp/hello.sh + set -e ++ 기본 이름 /tmp/hello.sh + 스크립트 이름 = hello.sh + lock=/var/run/hello.sh + exec + 무리 -n 200 + pid=4683 + 에코 4683 + 수면 60 + 에코 `안녕하세요 세계` 안녕하세요 세계 노트 는 flockfile 및 친구가 파일 잠금과는 아무 상관이 없습니다. stdio에서 FILE 개체의 내부 뮤텍스를 관리합니다. 무리 함수 래퍼가 활성 상태인 동안 명령이 호출되므로 BASH 변수를 짓밟거나 최종 명령에 영향을 주는 로컬 변수를 선언하지 않도록 몇 가지 트릭을 사용합니다. #!/bin/bash 세트-e 스크립트 이름=$(기본 이름 $0) lock=“/var/run/${스크립트 이름}“ exec 200>$lock 무리 -n 200 || 출구 1 ## 코드: pid=$$ 에코 $pid 1>&200 수면 60 에코 „안녕하세요 세계“ 내가 배운 한 가지: 리눅스는 무리가있다. 이것은 무리라는 도구 (예, 커널 함수와 같은 이름)와 함께 사용할 수있는 커널 함수입니다.

이 도구를 사용하면 bash 스크립트를 쉽게 잠글 수 있습니다. 예: -u, -잠금 해제 잠금 해제. 일반적으로 파일이 닫힐 때 잠금이 자동으로 삭제되므로 필수는 아닙니다. 그러나 예를 들어 동봉된 명령 그룹이 잠금을 보유하지 않아야 하는 백그라운드 프로세스를 포크한 경우와 같은 특별한 경우에 필요할 수 있습니다. 이 표에는 잠금 형식 간의 차이점이 요약됩니다. 자세한 설명 및 사용 예는 아래에 제공됩니다. flock()는 원자 모드 스위치를 보장하지 않습니다. 맨 페이지에서: `exec {lock_fd}>/var/lock/mylockfile`에서 여전히 경주 조건이 있기 때문에 이것은 100% 증거가 아닙니다. 무리에 대한 남자 페이지는 수십 년 동안 하위 쉘없이 그것을 수행하는 적절한 방법을 보여주고있다: exec {lock_fd}>/var/lock/mylockfile || 출구 1 무리 -n „$lock_fd“ || { 에코 „오류: 무리() 실패“ >&2; 1번 출구; } { { 무리 -n 19 || { 에코는 잠금을 획득할 수 없습니다; 1번 출구; } # 여기에 명령 } 19>/run/my.lock 이 주제에 대 한 좋은 기사는 여기에서 찾을 수 있습니다:쉘 스크립트에서 중요 한 섹션을 보호 하기 위해 무리를 사용 하 여 아마도 작은 예제 도움이 될 것입니다., 이것은 내 /tmp/hello.sh 스크립트: 어쩌면이 배쉬 랩 „무리-o-c …“ 당신에게 흥미로운 일이 될 것입니다 : 당신은 다른 터미널에서 병렬로이 두 조각을 실행하고 하나는 잠금을 들고있는 동안 자고있는 동안, 다른 무리에 차단되는 것을 볼 수 있습니다.

Dieser Eintrag wurde veröffentlicht in Allgemein. Lesezeichen auf den Permanentlink.