단일 인스턴스 만 보장하는 미세한 cron


9

1 분마다 (또는 2 또는 5 등) 스크립트를 실행하는 방법이 있습니까 (아직 실행되고 있지 않은 경우에만)?

매분마다 실행해야하는 스크립트 세트가 있습니다. 때로는 1 초 안에 시작하고 끝날 수도 있고 5 분 동안 계속 될 수도 있습니다.

동시 실행을 피하는 우리의 현재 방법은 is_running각 스크립트에서 플래그를 설정하고 여전히 활성화되어 있으면 종료하는 것입니다. 그러나 이것은 약간 신뢰할 수 없습니다 (즉, 치명적인 오류로 인해 스크립트가 중지 된 후에도 플래그가 계속 활성화되어있을 수 있습니다).

우리는 우리 자신의 작은 관리자를 쓸 수는 있지만 이미 존재하는 더 세련된 솔루션이 있는지 궁금합니다.


+1 나는 이것에도 관심이있다. 나는 대답을 모른다. 그러나 가능한 해결책에 관심이있다.
Saif Bechan

작은 cron은 "나를 데몬으로 만들어"많은 냄새를 맡는다
AD7six

답변:


9

더 좋은 방법은 flockpidfile 대신 사용하는 것입니다. 맨 페이지를 확인하십시오 : flock (1) . 장점은 프로세스가 완료되거나 완료 되더라도 잠금이 사라진다는 것입니다.


3

워너의 pid 파일 답변에 동의하는 경향이 있습니다. 그러나 Anacron의 다음 기능이이를 수행합니까?

-s
    Serialize execution of jobs. Anacron will not start a new job before the previous one finished. 

나는 그것을 직접 테스트하지 않았으며, anacron의 문서를 충분히 찾지 못했습니다 ...

특히 게으르고 싶다면 ;-) ps 출력을 통해 greping하면 프로세스가 실행 중으로 반환되면 스크립트를 종료하면됩니다. 그러나 잠금 / pid 파일이 가장 좋습니다.


anacron은 최신 버전의 cron이므로 이전 표준보다 많은 기능을 가지고 있습니다. '어떻게'에 관해서는 아마도 자식 프로세스가 죽을 때 트리거되는 SIGCHLD 핸들러를 등록합니다. 따라서 그것은 달리는 아이들을 추적하고 단순히 그 일을 건너 뛸 수 있습니다.
Javier

@ Javier : "anacron은 최신 버전의 cron이므로 이전 표준보다 많은 기능이 있습니다."에 동의하지 않습니다. 무엇 anacroncron해야 할 일간에 약간의 차이가 있지만 서로 다른 문제를 해결합니다. 를 사용 cron하면 기계가 다운되어 놓친 작업을 어떻게 시작할 수 있습니까? 을 사용하여 anacron12 월 25 일 또는 5 분마다 어떻게 작업을 시작 하시겠습니까? (물론 스크립트 해결 방법은 가능하지만 이것이 내가 말하는 것은 아닙니다.)
추가 통지가있을 때까지 일시 중지되었습니다.

@Kyle :이 옵션은 동시에 실행되도록 예약 된 다른 작업이 한 번에 하나씩 실행되도록합니다. OP의 요구에 맞을 수도 있지만 다른 작업을 차단하거나 다른 작업이 차단할 수 있습니다. 또한 anacron하루보다 짧은 기간에는 실행되지 않습니다.
추후 공지가있을 때까지 일시 중지되었습니다.

@ 데니스 윌리엄슨 : 당신이 옳은 것 같아요, 나는 역사 세부 사항을 확인하지 않았습니다. 그러나 여전히 cron이 거의 확립되고 그로부터 영감을 얻은 anacron 프로젝트에 동의 할 것입니다. 따라서 cron이 제공하지 않는 기능이 있다는 것은 놀라운 일이 아닙니다. 또한, 원래 질문은 cron에 관한 것이 었습니다
Javier

1

이것이 그 접근 방식에 적합한 솔루션입니다. 일반적으로 pid 파일이 사용되며 프로세스에 대해 pid 테스트가 수행되어 파일이 실행 중인지 확인합니다. 오래된 파일 인 경우 잠금 파일이 제거되고 프로세스가 계속 실행됩니다.

추가 정보는 일반적으로 cron에서 실행되는 대신 소프트웨어 자체에 데몬으로 작성됩니다.


1

스크립트가 flock (2) syscall을 지원하는 언어로 코딩 된 경우 함수 호출을 사용하여 잠금 파일을 flock () 할 수도 있습니다. 예:

이것을 지원하지 않는 Bash 또는 다른 스크립팅 언어에 붙어 있다면 이미 제안 된 flock (1) 솔루션 도 좋습니다.

PS 어쨌든 별도의 잠금 파일을 한 번만 작성하고 (존재하지 않는 경우) 절대 삭제하지 마십시오. "/ var / lock"디렉토리는 이러한 파일에 적합한 장소입니다.


0

이것은 스크립트가 파이썬에서 실행되는 경우 해결책입니다 (또는 다음 명령 전에 실행하기 위해 파이썬 명령을 만들 수 있습니다)-지난 주 에이 정확한 문제가 발생했지만 좋은 해결책을 찾았지만 매우 결정했습니다. 간단하고 깨끗한 파이썬 패키지를 PyPI에 업로드했습니다. 잠금 __file__할 사용자 정의 리소스 이름을 제공하는 것에 대해 생각할 필요가 없도록 확실히 잠글 수 있습니다.

다음을 사용하여 설치 : pip install quicklock

그것을 사용하는 것은 매우 간단합니다 :

[nate@Nates-MacBook-Pro-3 ~/live] python
Python 2.7.6 (default, Sep  9 2014, 15:04:36)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from quicklock import singleton
>>> # Let's create a lock so that only one instance of a script will run
...
>>> singleton('hello world')
>>>
>>> # Let's try to do that again, this should fail
...
>>> singleton('hello world')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/nate/live/gallery/env/lib/python2.7/site-packages/quicklock/quicklock.py", line 47, in singleton
    raise RuntimeError('Resource <{}> is currently locked by <Process {}: "{}">'.format(resource, other_process.pid, other_process.name()))
RuntimeError: Resource <hello world> is currently locked by <Process 24801: "python">
>>>
>>> # But if we quit this process, we release the lock automatically
...
>>> ^D
[nate@Nates-MacBook-Pro-3 ~/live] python
Python 2.7.6 (default, Sep  9 2014, 15:04:36)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from quicklock import singleton
>>> singleton('hello world')
>>>
>>> # No exception was thrown, we own 'hello world'!

살펴보십시오 : https://pypi.python.org/pypi/quicklock

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.