업무 의존성이있는 간단한 Linux 기반 작업 스케줄러? [닫은]


4

필자는 많은 종속 작업 (데이터 가져 오기, 변환 등)이 필요한 데이터웨어 하우징 시스템을 유지 관리하고 있습니다. 나는 리눅스의 crontab 작업 간의 의존성이 복잡해지기 전까지는이를 관리해야합니다.

기본적으로 나는 몇 가지를 찾고있다. cron 대체는 다음 시나리오에서 도움이됩니다.

  • 작업 A를에서 실행하십시오. 00:05 (쉬운). 일반적으로 이것이 가져 오기 작업입니다.

  • 작업 A가 완료되면 작업 B, C, D가 실행되도록 예약하십시오. 작업 D는 작업 A가 완료된 후 (부하 분산시) 30 분만 실행됩니다. 이들은 변환 작업입니다.

  • 작업 E는 B, C, D 모두 완료되면 실행됩니다. 일반적으로 집계 된 데이터를 웹 프런트 엔드 데이터베이스로 가져 오는 작업입니다.

이들 모두는 동일한 노드에서 발생합니다.

토폴로지 그래프처럼 보입니다.

A--> B -------------->---> E
 \-> C -------------/   /
 \-> (delay 30mins) -> D

이것을 지원하는 간단한 리눅스 기반 도구가 있습니까? 나는 들여다 보았다. 에어 비앤비의 크로노스 그러나 그것은 나의 필요에 과잉으로 보인다.

편집 : 위의 시나리오는 상황을 단순화 한 버전입니다. 우리에게는 훨씬 더 많은 일자리가 있으며 의존성은 훨씬 더 복잡합니다. 그래서 저는 각 시나리오를 맞추기 위해 case-by-case bash 스크립트보다 "cron on steroid"를 찾고 있습니다.


나는 Jenkins CI 서버를 사용하는 것이 과잉이라고 생각합니다. 아직도, 그것은 일할 것입니다.
Daniel Beck

1
당신 할 수 있었다 00:05 (임의의 crond를 통해)에서 실행되는 상당히 간단한 bash 스크립트로 작업 A를 시작하고 완료를 기다린 다음 백그라운드에서 B와 C를 시작하고 30 분 기다린 다음 D를 시작하는 백그라운드 프로세스를 시작합니다 E를 시작하기 전에 끝내기를 기다린 다음 E가 완료되면 종료합니다. 좋은 조치를 취하기 위해 약간의 오류 처리를 던지면 좋은 결과를 얻을 수 있습니다. 아마도 유용한 링크 : stackoverflow.com/q/356100/486504 stackoverflow.com/a/6041820/486504 Google은 "하위 프로세스에 대한 bash 대기"또는 유사합니다.
a CVn

마이클 : 고마워. 내 유스 케이스는 그보다 훨씬 복잡하다. 반영 할 질문을 업데이트했습니다.
huy

따라서 예를 들어 사용하지 않은 더 복잡한 버전을 처리 할 수있는 간단한 도구를 찾고 있습니다 ... 솔직히, 그렇다면 확실한 질문은 답할 수 없습니다. 그때 적어도 당신이 찾은 대안이 왜 당신의 필요에 "과잉"이라고 설명하고 특유한 당신이 필요로하는 기능.
a CVn

vicerveza.homeunix.net/~viric/soft/ts - 데비안 저장소에 있습니다.
LawrenceC

답변:


5

Michael Kjörling이 의견에서 제안했듯이 간단한 bash 스크립트를 사용하여이 작업을 수행 할 수 있어야합니다. 이 같은:

#!/usr/bin/env bash

## Log file to which the "echo" commands bellow will write
logfile="/tmp/$$.log"

## Change "ls /etc >/dev/null " to reflect the actual 
## jobs you want to run but keep the  "&& echo job N finished" as is.
jobA="ls /etc >/dev/null"
jobB="ls /etc >/dev/null && echo 'job B finished' >> $logfile"
jobC="ls /etc >/dev/null && echo 'job C finished' >> $logfile"
jobD="ls /etc >/dev/null && echo 'job D finished' >> $logfile"
jobE="ls /etc >/dev/null";

## Run job A, launch jobs B and C as soon as A is finished
## and launch job D 30 minutes after A finishes.
eval $jobA && (sleep 30 && eval $jobD) & eval $jobB & eval $jobC &


## Now, monitor the logfile and run job E when the rest have finished
while true; do
    lines=`wc -l $logfile | cut -f 1 -d ' '`;
    echo "$logfile : $lines"
    ## The logfile will contain 4 lines if all jobs have finished
    if [ "$lines" -eq 3 ];
    then
      ## Run job E
      eval $jobE 
      ## Delete the logfile
      rm $logfile
      ## exit the script
      exit 0;
    fi
    ## Only check if the jobs are finished once a minute
    sleep 60;
done

사용하는 경우 cron 00:05에이 스크립트를 시작하려면 원하는 것을해야합니다. 여기의 주요 트릭은 서브 셸 ()&&. 보조 쉘을 사용하면 여러 개의 백그라운드 작업을 실행할 수 있으며 && 다른 작업이 성공적으로 종료되면 작업 만 실행합니다.


@terdon에 감사드립니다. 미안해, 내 상황에 대해선 분명하지 않았다. 내가 가진 직업의 숫자는 그 이상이며, 상호 의존성은 훨씬 더 복잡합니다. 설명 된 시나리오는 일반적으로 일어날 일의 단순화 된 버전입니다.
huy

4

흥미로운 표정 :

이것들은 cron을 좋은 GUI로 대체하여 종속성 그래프를 보는 것을 목표로하는 파이썬 프로젝트 (digdag에 대한 기대)입니다.

필자는이 제품에 bash를 사용 했었지만 복잡한 시스템으로 성장할 때는 추악 해졌습니다.


2

BMC Software는 Control-M이라는 제품을 만들어 문제에 대한 설명에 가장 적합합니다. 그러나, 그것은 무료가 아니다 :(

우리는이를 사용하여 프로덕션 환경에서 약 500 개의 작업을 관리하고 테스트 환경에서 약 400 개의 어딘가를 관리합니다. 필요한 시스템에 클라이언트를 설치 한 다음 클라이언트에서 실행되도록 Control-M 서버에서 작업을 설정합니다. GUI 또는 명령 줄을 통해 관리 할 수있는 많은 구성 가능한 매개 변수 및 스케줄링 기준이 있습니다. 문제의 가장 적절한 부분은 작업에 대한 입 / 출력 조건 설정에 번창하므로 작업간에 끌어서 놓기만으로 종속성을 가질 수 있다는 것입니다. 한 번에 20 개 이상의 작업 흐름을 설정하는 데이 도구를 사용합니다.

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