링크 ux 는 flock 파일 잠 금 을 사용 하여 crontab 충돌 문 제 를 해결 합 니 다.

Liux 의 crontab 명령 은 정시 에 실행 할 수 있 습 니 다. 최소 주 기 는 분당 한 번 씩 실 행 됩 니 다.crontab 의 1 초 실행 에 관 해 서 는 제 이전 글 인 을 참고 하 십시오.
현재 문제 가 있 습 니 다. 매 분 에 한 번 씩 임 무 를 수행 하도록 설정 되 어 있 지만 1 분 안에 임 무 를 수행 하지 못 할 수도 있 습 니 다. 이 때 시스템 은 다시 임 무 를 수행 합 니 다.두 개의 같은 임 무 를 수행 하 게 만 들 었 다.
예 를 들 면:
<?
// test.php
for($i=0; $i<300; $i++){
    echo date('Y-m-d H:i:s')."\r
"; sleep(1); } ?>

300 회 순환 하고 한 번 순환 할 때마다 1 초 동안 잠 을 잔다.실행 완료 까지 는 300 초 즉 5 분 이 걸린다.
분당 실행 할 crontab 설정
* * * * * php /home/fdipzone/php/test.php >> /home/fdipzone/php/test.log

2 분 후, 사용 ps aux | grep test. php 를 보면 두 개의 test. php 프로 세 스 가 실행 되 고 있 습 니 다.
3 분 후에 3 개의 test. php 프로 세 스 가 실행 되 고 있 는 것 을 보 았 습 니 다.
fdipzone@ubuntu:/tmp$ ps aux|grep test.php
fdipzone  2995  0.0  0.0   4220   588 ?        Ss   00:28   0:00 /bin/sh -c php /home/fdipzone/php/test.php >> /home/fdipzone/php/test.log
fdipzone  2996  0.0  0.8 108328  8564 ?        S    00:28   0:00 php /home/fdipzone/php/test.php
fdipzone  3033  0.0  0.0   4220   584 ?        Ss   00:29   0:00 /bin/sh -c php /home/fdipzone/php/test.php >> /home/fdipzone/php/test.log
fdipzone  3034  0.1  0.8 108328  8564 ?        S    00:29   0:00 php /home/fdipzone/php/test.php
fdipzone  3047  0.0  0.0   4220   588 ?        Ss   00:30   0:00 /bin/sh -c php /home/fdipzone/php/test.php >> /home/fdipzone/php/test.log
fdipzone  3048  1.3  0.8 108328  8560 ?        S    00:30   0:00 php /home/fdipzone/php/test.php
fdipzone  3051  0.0  0.1  13148  1068 pts/0    S+   00:30   0:00 grep --color=auto test.php

우 리 는 지난 임 무 를 수행 하고 다음 임 무 를 수행 하 기 를 바 랍 니 다. 만약 에 지난 임 무 를 수행 하지 않 으 면 이번 임 무 는 집행 하지 않 고 다음 주기 까지 판단 합 니 다. 만약 에 지난 임 무 를 수행 하면 다음 임 무 를 수행 할 수 있 습 니 다.
개선 방법
우 리 는 작업 수행 여 부 를 기록 하기 위해 잠 금 파일 을 사용 할 수 있다.
먼저/tmp/my test. lock 이 존재 하 는 지 여 부 를 판단 하고 존재 하지 않 으 면 생 성 한 다음 작업 을 수행 하고 작업 을 수행 한 후 잠 금 파일 을 삭제 합 니 다.
잠 금 파일 이 존재 한다 면 이번 작업 을 종료 합 니 다.
<?php
$lockfile = '/tmp/mytest.lock';

if(file_exists($lockfile)){
    exit();
}else{
    file_put_contents($lockfile, 1, true);
}

for($i=0; $i<300; $i++){
    echo date('Y-m-d H:i:s')."\r
"; sleep(1); } unlink($lockfile); ?>

이렇게 하면 확실히 임 무 를 수행 하 는 동안 새로운 임 무 를 수행 하지 않 을 것 이 라 고 보장 할 수 있 지만, 이렇게 하려 면 작업 파일 에 코드 를 써 서 판단 해 야 하기 때문에 불편 하 다.미 션 잠 금 판단 을 미 션 밖 에 두 면 안 될까요?
링크 ux flock 파일 잠 금 을 사용 하여 작업 잠 금 을 실현 하고 충돌 을 해결 합 니 다.
형식:
flock [-sxun][-w #] fd#
flock [-sxon][-w #] file [-c] command
옵션
-s, --shared:           
-x, --exclusive:        
-u, --unlock:         ,       ,           
-n, --nonblock:           ,         
-w, --timeout:            ,      
-o, --close:                    。                   
-c, --command:    shell          
-h, --help           
-V, --version:       

첫 번 째 test. php 를 계속 사용 합 니 다. 파일 자 물 쇠 는 독점 자 물 쇠 를 사용 합 니 다. 잠 그 면 기다 리 지 않 습 니 다.매개 변 수 는 - xn
* * * * * flock -xn /tmp/mytest.lock -c 'php /home/fdipzone/php/test.php >> /home/fdipzone/php/test.log'

이렇게 하면 작업 이 완료 되 지 않 았 을 때 다음 작업 은/tmp/my test. lock 이 잠 겨 있 으 면 현재 작업 을 끝내 고 다음 주기 에 판단 합 니 다.

좋은 웹페이지 즐겨찾기