동일한 장기 실행 python 명령 줄 스크립트의 여러 인스턴스가 동시에 실행되는 것을 방지하려면 새 인스턴스가 원래 인스턴스로 데이터를 보낼 수 있도록 새 인스턴스를 보내고 싶습니다. 자살을 저지른다. 크로스 플랫폼 방식으로이 작업을 수행하려면 어떻게해야합니까?파이썬 스크립트는 동일한 스크립트의 다른 인스턴스가 실행 중임을 알 수 있습니까?
특히, 나는 다음과 같은 동작 사용하려는 :
- "
foo.py
은"명령 줄에서 시작되어, 그것은 기계가 될 때까지 긴으로 .. 일 또는 몇 주 동안 실행 남아있을 것입니다 재부팅되거나 상위 프로세스가이를 종료합니다. - 같은 스크립트가 다시 시작되지만 실행될 때 다른 명령 줄 매개 변수가
- 인 경우 스크립트는 다른 인스턴스가 실행 중인지 확인해야합니다.
- 다른 인스턴스가 실행중인 경우 인스턴스 # 2는 인스턴스 # 1에 명령 줄 매개 변수를 보내야하고 인스턴스 # 2는 종료되어야합니다.
- 인스턴스 # 1은 다른 스크립트에서 명령 줄 매개 변수를 받으면 새 스레드를 시작하고 (위의 단계에서 보낸 명령 줄 매개 변수를 사용하여) 인스턴스 # 2가 수행 할 작업을 수행하기 시작해야합니다 .
그래서 저는 두 가지를 찾고 있습니다 : 어떻게 파이썬 프로그램이 자체의 다른 인스턴스가 실행되고 있는지 그리고 어떻게 파이썬 명령 행 프로그램이 다른 것과 통신 할 수 있습니까?
이 스크립트를 더 복잡하게 만드는 것은 Windows와 Linux 모두에서 동일한 스크립트를 실행해야하므로 이상적으로 솔루션은 OS 특정 호출이 아닌 Python 표준 라이브러리 만 사용하는 것이 이상적입니다. Windows codepath와 * nix codepath (그리고 내 코드에서 큰 코드 if
) 중 하나를 선택해야하는 경우에는 "동일한 코드"솔루션을 사용할 수 없다면 괜찮습니다.
필자는 파일 기반 접근법 (예 : 인스턴스 # 1이 변경 사항을 감시하고 각 인스턴스가 작업을 수행하려고 할 때 해당 디렉토리에 파일을 놓는 등)을 해결할 수 있음을 알고 있지만 약간 걱정이됩니다. 비 정상적인 시스템 종료 후 해당 파일을 정리합니다. 이상적으로는 메모리 내 솔루션을 사용할 수 있습니다. 그러나 다시 말하지만 융통성이 있습니다. 파일 기반의 영구적 인 접근 만이이를 수행 할 수있는 유일한 방법이라면, 나는 그 옵션에 개방적입니다.
추가 정보 : 우리 서버가 모니터링 도구 (예 : 데이터베이스 쿼리 또는 웹 서비스 호출 결과)를 수집하기 위해 파이썬 스크립트를 실행하는 모니터링 도구를 사용하고 있기 때문에이 작업을 수행하려고합니다. 나중에 사용하십시오. 이 스크립트 중 일부는 시작하는 데 비용이 많이 들지만 시작 후 실행하기가 저렴합니다 (예 : DB 연결 만들기와 쿼리 실행). 그래서 우리는 부모 프로세스가 그들을 죽일 때까지 무한 루프에서 실행되도록 선택했습니다.
위대한 작품이지만 큰 서버에서는 각각 20 분마다 데이터를 수집하는 경우에도 동일한 스크립트의 인스턴스가 100 개 실행될 수 있습니다. 이것은 RAM, DB 연결 제한 등으로 큰 혼란을 야기합니다. 우리는 하나의 스레드가있는 100 개의 프로세스에서 100 개의 스레드로 하나의 프로세스로 전환하려고합니다. 각 스레드는 이전에 하나의 스크립트가 수행하고 있던 작업을 실행합니다.
그러나 모니터링 도구로 스크립트를 호출하는 방법을 변경하는 것은 불가능합니다. 우리는 호출을 동일하게 유지하고 (다른 명령 행 매개 변수로 프로세스를 시작) 스크립트를 변경하여 다른 스크립트가 활성 상태임을 인식하고 "new"스크립트가 명령 행 매개 변수의 작업 지시를 보내도록합니다. "old"스크립트에 추가하십시오.
나는이 스크립트를 원 스크립트로하고 싶지 않습니다. 대신이 동작을 많은 스크립트 작성자가 활용할 수있는 라이브러리에 패키지화하려고합니다. 내 목표는 스크립트 작성자가 다중 인스턴스 문제를 인식하지 못하는 단순한 단일 스레드 스크립트를 작성하고 다중 스레드를 처리 할 수있게하는 것입니다 커버 아래 단일 인스 턴싱.
작업 스크립트가 명령 호출 스크립트와 다른 이유는 무엇입니까? 작업자 스크립트는 모니터링 프레임 워크에서 호출 한 명령 릴레이 클라이언트가 보낸 명령을받는 서버 프로세스 일 수 있습니다.이 작업은 서버에게 수행 할 작업을 알려주는 작업입니다. – Bernd