2017-11-25 6 views
3

Perl 스크립트에서 리소스를 많이 사용하는 프로그램 [특히 rclone]을 Google 드라이브에 전송하는 중입니다. 나는 어떤 조건 (등, 충돌, 동결, 서버 과부하를 방지 관련 아무것도)을 기반으로 rclone의 인스턴스의 수를 제한하기 위해 필요로하는Perl 스크립트 내에서 실행되는 프로그램의 동시 인스턴스 수 제한 (> 1)

나는, 내가 rclone를 호출하는 방법을 알아낼 못하고있다. rclone을 실행하기 전에 스크립트가 적절한 시스템 "조건"을 기다리는 것이 좋습니다 (길거나 부정확 한 시간이 될 수 있습니다).

일부 세부 정보 : 스크립트 자체가 본질적으로 다른 프로그램 (아마도 많은) 파일이 들어있는 파일이나 디렉토리 경로 전달

  • (파이썬으로 작성된이 프로그램은 -이 프로그램 참조 <A> 전화).
  • <A>은 스크립트에 값만 반환하므로 입력을 허용하는 것 외에는 스크립트 또는 rclone에 대해 아무것도 알지 못합니다.
  • <A>
  • <A> 화재 가변 간격 (즉 <A>을 변경하는 제 켄 넘어) 변경 될 수 없다 [즉 때때로 여러 번 스크립트를 연속적으로 실행합니다 (여러 인스턴스 생성). 다른 경우에는 몇 시간, 분 등의 시간에 한 번만 실행될 수 있습니다.
  • rclone을 직접 변경할 수 없습니다 (즉, 내 켄을 넘어서).
  • 절대적으로 필요한 경우 rclone 대신 스크립트의 인스턴스 수를 제한 할 수 있습니다 (단, rclone 만 있으면 좋겠지 만 스크립트로 수행되는 처리가 다소 제한적이고 제한이 필요하지 않음).
  • 모듈을 사용해도됩니다.
  • 나는 절대적으로 필요한 경우를 제외하고는 pgrepps과 같은 유닉스 계열 운영체제를 사용하지 않기를 바란다.

현재 필자는 Perl 스크립트 대신 다소 잘못 작성된 bash 스크립트를 사용하고 있습니다. bash 스크립트는 pgrep -wc, sleep, while 루프 및 if 문을 사용하여 기본 (잘못 설계된) "점검/수면 루프"를 구현합니다. (솔직히 말해서 bash 스크립트가 실제로 작동/도움이된다고 생각하지 않습니다.)

+0

** GNU Parallel **을'sem -j N '으로 호출 할 수 있으며'N' 인스턴스를 https://stackoverflow.com/a/46206137/2836621 및 https : //와 같이 병렬로 실행할 수 있습니다 www.gnu.org/software/parallel/sem.html –

+0

@Mark 아 그래, 그 유용한 프로그램에 대해 완전히 잊어 버렸고 Perl로도 작성되었다. 명령이 _different_ 스크립트에서 여러 번 호출 될 때마다 세마포어 기능이 작동하는지 여부를 알고 있습니까? 그것은 --- 화장실 유추를 사용하여 ---- 각 스크립트 인스턴스가 다른 스크립트 인스턴스에 액세스 할 수있는 자체 "화장실 룸"을 갖거나 모든 스크립트 인스턴스가 동일한 "룸"을 사용합니까? – YenForYang

+1

예, 서로 다른 프로그램이 모두 링크 된 답변에서와 같이 동일한 '--id'를 제공하는 한. –

답변

4

잠시 동안 스크립트가 rclone을 실행하는 것으로 가정합니다. 달리기를 원할 경우 you would just use a lockfile.

N 인스턴스 (작은 N의 경우)에는 N 개의 잠금 파일이 있습니다. 프로그램에서 각 잠금을 루프에서 차례대로 시도하도록하십시오. 모든 잠금이 이미있는 경우 일시 중지하고 루프에서 1 초 후에 다시 시도하십시오. 잠금 장치가 있으면 rclone을 실행 한 다음 잠금이 해제되면 잠금을 해제하십시오.


더 사운드 접근 방식은 당신이 큰 N을 원하지 않는다면, 정말 응답 시간에 대해 신경 또는 발신자 사이의 공정성에 대한 걱정, 시스템 V 세마포어를 사용할 수 있지만 것, 그들을 학습 시간 가치가있을 것 같지 않다 .위의 후 전화로 병렬 제약 조건을 구현하는 랩퍼가 rclone을 대체 할 수있는 대신 프로그램에서이 코드를 넣는 - 스크립트가 rclone를 호출하는 유일한 프로그램이 아닌 경우


, 모든 통화를 차단해야 진짜 프로그램.

2

GNU의 병렬 https://www.gnu.org/software/parallel/man.html#EXAMPLE:-GNU-Parallel-as-queue-system-batch-manager

true >jobqueue; tail -n+0 -f jobqueue | parallel -j10 --timeout 1h rclone 

작업 큐에서 작업 그리고이 같은 <A>을 실행할 수 있습니다

<A> >> jobqueue 

이제 다음 jobqueue를 정리해야합니다. 그러나 <A>가 미친 양의 데이터를 생성하지 않는 한 일반적으로 재부팅 할 때마다 0으로 만드는 것으로 충분합니다 (true >jobqueue).