셸 스 크 립 트 파일 잠 금 기능 구현

4030 단어 shell파일 잠 금
1.배경
여러 프로 세 스 가 같은 데 이 터 를 실행 할 수 있 을 때,이 프로 세 스 들 은 데 이 터 를 손상 시 키 지 않도록 다른 프로 세 스 가 조작 하지 않 았 음 을 보증 해 야 합 니 다.일반적으로 이러한 프로 세 스 는'잠 금 파일'을 사용 합 니 다.즉,다른 프로 세 스 가 실행 중인 것 을 알려 주 는 파일 을 만 듭 니 다.그 파일 이 존재 하 는 것 을 감지 하면 같은 데 이 터 를 조작 하 는 프로 세 스 가 작업 하고 있다 고 생각 합 니 다.이러한 문 제 는 프로 세 스 가 부주의 로 사망 하여 그 자물쇠 파일 을 정리 하지 않 았 다 면 사용자 가 수 동 으로 정리 할 수 밖 에 없다 는 것 이다.
2.flock 에 대하 여
flock 은 전체 파일 에 대한 건의 적 인 자물쇠 입 니 다.즉,프로 세 스 가 파일(inode)에 자 물 쇠 를 잠 그 면 다른 프로 세 스 는 알 수 있 습 니 다.(프로 세 스 준 수 를 강요 하지 않 습 니 다.)가장 좋 은 점 은 첫 번 째 매개 변 수 는 파일 설명자 입 니 다.이 파일 설명자 가 닫 혔 을 때 잠 금 이 자동 으로 풀 립 니 다.프로 세 스 가 종 료 될 때 모든 파일 설명 자 는 종 료 됩 니 다.
3.셸 에서 flock 시스템 호출 을 실현 하 는 명령 은 flock 이 며,사용 형식 은 다음 과 같은 두 가지(man flock)가 있 습 니 다.

flock [-sxon] [-w timeout] lockfile [-c] command...
flock [-sxun] [-w timeout] fd
옵션 과 인자:
-s,--shared:공유 자 물 쇠 를 가 져 옵 니 다.특정한 파일 의 FD 에 공유 자 물 쇠 를 설정 하고 자 물 쇠 를 풀 지 않 은 시간 동안 다른 프로 세 스 가 이 파일 의 FD 에 독점 자 물 쇠 를 설정 하려 는 요청 이 실 패 했 습 니 다.다른 프로 세 스 는 이 파일 의 FD 에 공유 자 물 쇠 를 설정 하려 는 요청 이 성공 합 니 다.
-x,-e,--exclusive:열 쇠 를 가 져 오 거나 기록 자물쇠 라 고 부 르 는 것 을 기본 항목 으로 합 니 다.
-u,--unlock:수 동 으로 자 물 쇠 를 풀 수 있 습 니 다.일반적인 상황 은 필요 하지 않 습 니 다.FD 가 닫 혔 을 때 시스템 은 자동 으로 자 물 쇠 를 풀 수 있 습 니 다.이 매개 변 수 는 스 크 립 트 명령 의 일부분 은 비동기 로 실행 되 어야 하고 일부분 은 동기 화 할 수 있 는 경우 에 사 용 됩 니 다.
-n,--nb,--nonblock:차단 모드 가 아 닙 니 다.잠 금 을 가 져 오 는 데 실 패 했 을 때 1 을 기다 리 는 것 이 아 닙 니 다.
-w,--wait,--timeout seconds:차단 시간 초과 설정,설정 초 수 를 초과 할 때 차단 모드 를 종료 하고 1 을 되 돌려 주 며 뒤의 문 구 를 계속 실행 합 니 다.
-o,-close:command 를 실행 하기 전에 자 물 쇠 를 설정 한 FD 를 닫 아서 command 의 하위 프로 세 스 가 자 물 쇠 를 유지 하지 않도록 합 니 다.
-c,--command command:셸 에서 다음 문장 을 실행 합 니 다.
4.셸 에서 스 크 립 트 가 반복 되 지 않도록 잠 금 을 설정 합 니 다.
Linux 의 일반적인 작업 스케줄 인 crontab 는 정기 적 으로 스 크 립 트 를 실행 하지만 스 크 립 트 의 실행 시간 은 제어 할 수 없습니다.스 크 립 트 가 너무 오래 실행 되면 지난 작업 의 스 크 립 트 가 아직 완성 되 지 않 았 고 다음 작업 의 스 크 립 트 가 다시 실 행 될 수 있 습 니 다.이런 상황 에서 일부 병발 문제 가 발생 할 수 있 고 심각 할 때 더러 운 데이터/성능 병목 의 악순환 을 초래 할 수 있다.
플 로 크 를 사용 하여 열 쇠 를 만 들 면 이 문 제 를 피 할 수 있 습 니 다.만약 프로 세 스 가 열 쇠 를 추가 하면 다른 프로 세 스 는 자 물 쇠 를 추가 할 수 없습니다.시간 이 초과 되 거나 바로 돌아 오 기 를 기다 릴 수 있 습 니 다.테스트 실례 는 다음 과 같다.
4.1 실행 스 크 립 트 생 성

#cat /scripts/shell/file_lock.sh
#!/bin/bash
# Description: test for file flock
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

echo ""
echo "----------------------------------"

echo "start at `date '+%Y-%m-%d %H:%M:%S'` ..."

sleep 140s

echo "finished at `date '+%Y-%m-%d %H:%M:%S'` ..."

4.2 정시 퀘 스 트 생 성:잠 금 테스트

#crontab -e
* * * * * flock -xn /dev/shm/test.lock -c "sh /scripts/shell/file_lock.sh > /root/stdout.log"
이 스 크 립 트 를 분당 한 번 실행 하고 출력 정 보 를 stdout.log 에 기록 합 니 다.
 
출력 로그 보기:

----------------------------------
start at 2014-04-10 10:23:01 ...            #
finish at 2014-04-10 10:25:21 ...           #
 
 
----------------------------------
start at 2014-04-10 10:26:01 ...            #10:27:00 10:28:00 , , 10:26:00
finish at 2014-04-10 10:28:21 ...
4.3 테스트 잠 금,대기 시간 초과

* * * * * flock -x -w 20 /dev/shm/test.lock -c "sh /scripts/shell/file_lock.sh > /root/stdout.log"
로그 출력 정보 보기:

----------------------------------
start at 2014-04-10 10:29:01 ...
finish at 2014-04-10 10:31:21 ...
 
----------------------------------
start at 2014-04-10 10:31:21 ...    #10:31:00 20 , , ,
finish at 2014-04-10 10:33:41 ...

좋은 웹페이지 즐겨찾기