2010-11-23 9 views
4

예를 들어, 정기적으로 cron 작업으로 실행하고 싶은 스크립트가 10 개 있습니다. 그러나, 나는 그들 모두가 동시에 달리는 것을 원하지 않는다. 나는 그들 중 2 명만 동시에 달리고 싶다.프로세스 스케줄링

내가 생각하고있는 한 가지 해결책은 두 개의 스크립트를 만들고 각각에 5 개의 명령문을 넣은 다음 crontab에 별도의 항목으로 넣는 것입니다. 그러나 해결책은 매우 특별하게 보입니다.

위에서 언급 한 작업을 수행 할 수있는 기존 유닉스 도구가 있습니까?

+0

당신이 어떤 순서에 따라 다음 스크립트를 실행해야합니까? – ajreal

+0

@ajreal, 아니요 특정 주문이 필요하지 않습니다. 그들은 서로 독립적입니다. –

답변

1

jobs 내장은 얼마나 많은 하위 프로세스가 실행 중인지 알 수 있습니다.

MAX_JOBS=2 

launch_when_not_busy() 
{ 
    while [ $(jobs | wc -l) -ge $MAX_JOBS ] 
    do 
     # at least $MAX_JOBS are still running. 
     sleep 1 
    done 
    "[email protected]" & 
} 

launch_when_not_busy bash job1.sh --args 
launch_when_not_busy bash jobTwo.sh 
launch_when_not_busy bash job_three.sh 
... 
wait 
+0

이것은 재미있을 것 같습니다. 나는 그것을 시험해보고 그것이 어떻게되는지 알려줄 것입니다. –

1

참고 : mobrule이 지적한 것처럼, 인수가없는 대기 호출은 모든 자식이 완료 될 때까지 기다리기 때문에 원래 응답이 작동하지 않습니다. 따라서 더 자식 프로세스의 비용으로 폴링을 방지 다음 'parallelexec'스크립트 :

#!/bin/bash 

N="$1" 

I=0 

{ 
     if [[ "$#" -le 1 ]]; then 
       cat 
     else 
       while [[ "$#" -gt 1 ]]; do 
         echo "$2" 

         set -- "$1" "${@:3}" 
       done 
     fi 
} | { 
     d=$(mktemp -d /tmp/fifo.XXXXXXXX) 

     mkfifo "$d"/fifo 

     exec 3<>"$d"/fifo 

     rm -rf "$d" 

     while [[ "$I" -lt "$N" ]] && read C; do 
       ($C; echo >&3) & 

       let I++ 
     done 

     while read C; do 
       read -u 3 

       ($C; echo >&3) & 
     done 
} 

첫 번째 인수는 병렬 작업의 수입니다. 더 많은 것이 있다면, 각각 하나의 작업으로 실행됩니다. 그렇지 않으면 실행할 모든 명령이 stdin에서 한 줄씩 읽 힙니다.

필자는 동기화 방법으로 명명 된 파이프 (쉘이 열리 자마자 망각으로 전송 됨)를 사용합니다. 단일 바이트 만 쓰여지기 때문에 상황을 복잡하게 만들 수있는 경쟁 조건 문제가 없습니다.

+0

builtin 'wait'는 자식 프로세스가 모두 완료 될 때까지 기다린다. – mob

+0

사실, 그 특별한 bash의 뇌사가 발생하지 않았다. fds/read로 바꾸기 ... – thkala

1

GNU 병렬이 작업의 이런 종류의 설계 : do_stuff 또는 do_other_stuff 하나가 완료되면

sem -j2 do_stuff 
sem -j2 do_other_stuff 
sem -j2 do_third_stuff 

do_third_stuff 만 실행됩니다 몇 가지 간단한 쉘 스크립트는이 작업을 수행 할 수 있습니다. 인트로 동영상

시계 더 많은 것을 배울 수 :

http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1