2014-09-23 2 views
1

/Cobra를 사용하여 백그라운드에서 다양한 작업을 실행해야합니다.BASH에서 시작한 프로세스를 포함하여 BASH에서 프로세스를 세는 방법?

저는 32 개의 코어를 가지고 있고, 다른 커플을 자유롭게하고 싶습니다. 그렇지 않으면 내 머신이 다른 것을하기에는 너무 느려집니다. 이 코드에서

나는 그러나, "PS"적시에 정보를 제공하는 표시되지 않습니다 PS를 사용하여 프로세스의 수를 확인 만 30

의 최대 수를 시작합니다. 3 초를 기다리지 만 ps는 때때로 일치하는 프로세스의 수를 선언합니다. 이것은 아마도 그들은 단지 백그라운드에서 시작하고있을 때입니다.

ps (또는 otehrwise)에서 더 좋은 대답을 얻는 방법이 있습니까? 내가 가지고있는 유일한 해결책은 더 오래자는 것이지만, 그것은 약간 무겁습니다.

#!/bin/sh 
#set -x 

while true 
do 
    NUMRUNNING=`ps | egrep FormsApplic | wc -l` 

    JOBS=`cat jobs.lst | wc -l` 
    if [ $JOBS -gt 0 ] 
    then 

     MAXSTART=$((30-$NUMRUNNING)) 
     NUMTOSTART=$JOBS 

     if [ $NUMTOSTART -gt $MAXSTART ] 
     then 
      NUMTOSTART=$MAXSTART 
     fi 
     for ((i=1;i<=$NUMTOSTART;i++)) 
     do 
      JOB=`head -n1 jobs.lst` 
      echo $JOB >> /tmp/jobsStarted 
      sed -i 1d jobs.lst 
      /cobra $JOB & 

     done 

    fi 

    LASTNUMRUNNING=$NUMRUNNING 
    sleep 3 
done 

답변

0

ps은 즉시 프로세스를 나열해야합니다. 나는 당신을 위해 무엇이 잘못 될지 모르지만이 스크립트는 몇 가지 개선점이 있습니다. 이들 중 최고는 ps을 구문 분석하는 대신 pgrep을 사용합니다.

while true 
do 
    NUMRUNNING=$(pgrep -c FormsApplic) 

    JOBS=$(wc -l jobs.lst) 
    if [ "$JOBS" -gt 0 ] 
    then 

     MAXSTART=$((30-$NUMRUNNING)) 
     NUMTOSTART=$JOBS 

     if [ "$NUMTOSTART" -gt "$MAXSTART" ] 
     then 
      NUMTOSTART="$MAXSTART" 
     fi 
     for ((i=1;i<="$NUMTOSTART";i++)) 
     do 
      JOB=$(head -n1 jobs.lst) 
      echo "$JOB" >> /tmp/jobsStarted 
      sed -i 1d jobs.lst 
      /cobra "$JOB" & 
     done 

    fi 

    LASTNUMRUNNING=$NUMRUNNING 
    sleep 3 
done 
0

당신은/proc 디렉토리 가상 파일 시스템을 사용할 수 있습니다 : 그것은 문제가 해결되는지 알려주세요

CURRENTLY_RUNNING = $ (찾기/proc 디렉토리/[0-9] */EXE 2>/cobra/greb cobra | wc -l)

또 다른 방법은/cobra를 시작하고 파일을 계산할 때마다 PID 파일을 만드는 것입니다. 유일한 문제는 PID 파일을 삭제하는 것입니다. 이는 래퍼 스크립트로 보관할 수 있습니다 :

/cobra.sh :

touch /var/run/cobra/run.$$ 
/cobra 
rm /var/run/cobra/run.$$ 
+0

모든 운영 체제에'/ proc' 파일 시스템이있는 것은 아닙니다. – chepner

0

오히려 프로세스의 수를 쿼리보다, 카운터 스스로를 유지합니다.

num_running=0 
while read job; do 
    if [ $num_running -eq $max_start ]; then 
     # wait for the oldest job to complete. Not ideal, 
     # since another job might complete before that one. 
     wait $(jobs -p | head -n 1) 
     num_running=$((num_running - 1)) 
    fi 
    /cobra $JOB & 
    num_running=$((num_running+1)) 
done < jobs.lst 

당신이 bash 4.3을 사용하는 경우 (드디어!) 오히려 모든 작업의 ​​특정 부분 집합보다 완료하는 임의의 작업에 기다릴 수 있습니다.

num_running=0 
while read job; do 
    if [ $num_running -eq $max_start ]; then 
     # Wait for any one background job to complete 
     wait -n 
     num_running=$((num_running - 1)) 
    fi 
    /cobra $JOB & 
    num_running=$((num_running+1)) 
done < jobs.lst 
0

이 선으로 전체 스크립트를 교체 시도 할 수 있습니다 :

< jobs.lst xargs -n 1 -P 30 /cobra 

xargs 명령은 /cobra 명령에 대한 인수로 jobs.lst의 각 행을로 디스패치합니다, 최대 30 개 병렬 프로세스를 생성.

여기에 합성 예이다

$ cat jobs.lst 
1 
2 
3 
4 

$ time < jobs.lst xargs -n 1 -P 2 sleep & 
[1] 5291 
$ ps aux|grep -i [s]leep|grep -v xargs 
user  5297 0.0 0.0 2426644 320 s002 S  3:25PM 0:00.00 sleep 2 
user  5296 0.0 0.0 2426644 320 s002 S  3:25PM 0:00.00 sleep 1 
$ ps aux|grep -i [s]leep|grep -v xargs 
user  5297 0.0 0.0 2426644 320 s002 S  3:25PM 0:00.00 sleep 2 
user  5303 0.0 0.0 2426644 320 s002 S  3:25PM 0:00.00 sleep 3 
$ ps aux|grep -i [s]leep|grep -v xargs 
user  5309 0.0 0.0 2426644 320 s002 S  3:25PM 0:00.00 sleep 4 
user  5303 0.0 0.0 2426644 320 s002 S  3:25PM 0:00.00 sleep 3 
$ ps aux|grep -i [s]leep|grep -v xargs 
user  5309 0.0 0.0 2426644 320 s002 S  3:25PM 0:00.00 sleep 4 
$ 
real 0m6.014s 
user 0m0.002s 
sys 0m0.009s 

그리고 2 일 2 + 4 = 6 초 총 실행 시간, 각 순간에 병렬로 실행되는 것을 볼 수있다.

관련 문제