단일 인스턴스 만 보장하는 미세한 cron is_running각 스크립트에서 플래그를

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

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

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

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



답변

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


답변

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

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

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

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


답변

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

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


답변

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

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

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


답변

이것은 스크립트가 파이썬에서 실행되는 경우 해결책입니다 (또는 다음 명령 전에 실행하기 위해 파이썬 명령을 만들 수 있습니다)-지난 주 에이 정확한 문제가 발생했지만 좋은 해결책을 찾았지만 매우 결정했습니다. 간단하고 깨끗한 파이썬 패키지를 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


답변