2014-12-11 2 views
2

잠재적으로 오랫동안 실행되는 스크립트가 있습니다. Linux의 경우. 실행 중일 때 동일하거나 다른 사용자가 두 번 호출 할 때이를 감지하고 실행을 거부해야합니다. 프로세스가 어떤 이유로 죽어도 정리 된 적합한 세마포를 만드는 방법을 찾으려고합니다.Perl 스크립트가 두 번 이상 병렬로 실행되는 것을 방지하는 방법

나는 How to prevent PHP script running more than once?을 물론 적용 할 수 있지만, 펄에서 더 잘 할 수 있는지 궁금합니다.

예를 들어 Perl은 프로세스 종료와 관계없이 트리거가 발생한다고 생각하는 "프로세스 종료시 임시 파일 생성 정리"플래그 (File :: Temp :: CLEANUP)를 가지고 있습니다. 그러나이 API는 임의의 이름을 가진 임시 파일을 생성하는 데만 사용할 수 있으므로 세마포어의 파일 이름으로 작동하지 않습니다. 파일이 제거되는 방식에 대한 기본 메커니즘을 이해하지 못하지만 메커니즘이 존재하는 것처럼 들립니다. 명명 된 파일 (예 :/var/run/foobar?

아니면 더 나은 방법이 있습니까?

+0

다른 순서로 그 싶지 :

open(my $fh, '>', '/var/run/foobar'); print $fh "$$\n"; close $fh; 

그럼 당신은 그것을 읽을 수있는 잠금 파일을 생성 . – sebnukem

답변

6
use strict; 
use warnings; 
use Fcntl ':flock'; 

flock(DATA, LOCK_EX|LOCK_NB) or die "There can be only one! [$0]"; 


# mandatory line, flocking depends on DATA file handle 
__DATA__ 
+0

당신은 나를 여기 곤란하게했습니다. 이 __ DATA__ 비즈니스는 무엇입니까? –

+2

@JohannesErnst check http://perldoc.perl.org/perldata.html#Special- Literal * __DATA__ 이후의 텍스트는 파일 핸들 PACKNAME :: DATA를 통해 읽을 수 있습니다. 여기서 PACKNAME은 __DATA__ 토큰을 만났을 때 현재 있었던 패키지입니다 . 파일 핸들은 __DATA __ * 뒤에 줄을 가리키는 채 열려 있습니다. –

1

한 가지 방법은 파일에 pid를 넣는 것입니다. 그러면 스크립트에서 실행중인 프로세스를 확인할 수 있습니다.

if (open(my $fh, '<', '/var/run/foobar')) { 
    while (my $PID = <$fh>) { 
     chomp $PID; 
     $proc = `ps hp $PID -o %c`; 
     if ($proc eq "foobar"){ 
      exit(); 
     } 
     break; 
    } 
} 

은 아마 내가 PHP와 같이 동일 할 것

관련 문제