PERL 프로그램의 하나의 인스턴스 만 실행하는지 확인하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/455911

  •  19-08-2019
  •  | 
  •  

문제

이 작업을 수행하는 방법에는 여러 가지가 있지만 어느 쪽이 최고인지 확실하지 않습니다.

내가 생각할 수있는 것은 다음과 같습니다.

  • pgrep을 사용하여 프로세스를 찾으십시오.
  • 플록을 사용하여 스크립트 잠금 자체를 사용한 다음 실행할 때마다 잠겨 있는지 확인하십시오.
  • /var/run/program_name.pid에서 PID 파일을 만들고 존재를 확인하고 필요한 경우 PID를 비교하십시오.

아마도 더 많은 방법이있을 것입니다. 최선의 접근 방식은 무엇이라고 생각하십니까?

도움이 되었습니까?

해결책

그것을하는 방법에는 여러 가지가 있습니다. PID 파일은 전통적인 방법입니다. 예를 들어 프로그램 자체와 같은 파일에 잠금 장치를 보유 할 수도 있습니다. 이 작은 코드 조각은 다음을 수행합니다.

use Fcntl ':flock';
open my $self, '<', $0 or die "Couldn't open self: $!";
flock $self, LOCK_EX | LOCK_NB or die "This script is already running";

PID 파일보다 한 가지 장점은 프로그램이 종료 될 때 파일이 자동으로 잠금 해제된다는 것입니다. 신뢰할 수있는 방식으로 구현하는 것이 훨씬 쉽습니다.

다른 팁

이전 PID 파일 트릭을 수행하십시오.

  • 프로세스를 시작하십시오
  • "myProg.pid"라는 파일이 있는지 확인하십시오.
  • Running Proc.의 존재를 확인하십시오. 킬 0, $ pid를 사용하여 일치하는 PID
  • PID Proc의 Prog 이름 인 경우 일치하고, 큰 소리로 불평하고 종료
  • 그렇지 않다면 오래된 "myprog.pid"를 정리하십시오.
  • "myprog.pid"라는 파일을 만들고 계속

HTH

건배,

나열된 모든 옵션은 괜찮습니다. 그러나 이것의 한 가지는 드문 경우에, 당신은 아주 오랫동안 실행되는 프로세스 (즉, 무언가를 기다리는 것을 기다리는 과정)로 끝날 수 있다는 것을 알고 있어야합니다. 다른 달리기 인스턴스가 실행중인 시간을 주시하고 일정량 (예 : 일과 같은)을 초과하는 경우 경고를 보낼 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top