Не удается найти процесс, указанный командой `jobs` - PullRequest
2 голосов
/ 20 февраля 2020

Я использую команду jobs для управления количеством ресурсоемких процессов. Я хочу не запускать более max_cnt процессов одновременно и останавливаться только после остановки всех процессов.

Я использую ниже bash скрипт для выполнения sh этого. Однако этот код всегда указывает, что один процесс работает, даже после того, как все выполнено и остановлено.

Более того, я не могу найти этот процесс в списке htop процессов. Что мне делать или где искать этот процесс, который указан в результате выполнения команды echo $(jobs -p), и как мне решить эту проблему, не выходя из нее, даже когда все останавливается.

#!/usr/bash

SLEEP=5
max_cnt=8

# generate a random number less than eq $1
function random {
    rand=$RANDOM
    while [ "$rand" -gt $1 ]
    do
        rand=$RANDOM
    done
}

function job {
    # resource intensive job simulated by random sleeping
    echo param1="$1",param2="$2"
    random 20
    echo Sleeping for $rand
    sleep $rand
}

for param1 in 1e-6 1e-5 1e-4 1e-3 1e-2
do
    for param2 in "ones" "random"
    do
        echo starting job with $param1 $param2
        job $param1 $param2 &
        while [ "$(jobs -p|wc -l)" -ge "$max_cnt" ]
        do
            echo "current running jobs.. $(jobs -p|wc -l) ... sleeping"
            sleep $SLEEP
        done
    done
done

while [ "$(jobs -p|wc -l)" -ge 1 ]
do
    echo "current running jobs.. $(jobs -p|wc -l) ... sleeping"
    sleep $SLEEP
    echo $(jobs -p)
done

1 Ответ

2 голосов
/ 20 февраля 2020

Как уже упоминалось в комментариях, вы можете рассмотреть возможность использования GNU Parallel , это облегчает жизнь при управлении параллельными заданиями. Ваш код может выглядеть следующим образом:

#!/usr/bin/env bash

function job {
    # resource intensive job simulated by random sleeping
    echo param1="$1",param2="$2"
    ((s=(RANDOM%5)+1))
    echo Sleeping for $s
    sleep $s
}
# export function to subshells
export -f job

parallel -j8 job {1} {2} ::: 1e-6 1e-5 1e-4 1e-3 1e-2 ::: "ones" "random"

Пример вывода

param1=1e-6,param2=ones
Sleeping for 1
param1=1e-5,param2=ones
Sleeping for 1
param1=1e-2,param2=ones
Sleeping for 1
param1=1e-4,param2=ones
Sleeping for 2
param1=1e-4,param2=random
Sleeping for 2
param1=1e-6,param2=random
Sleeping for 4
param1=1e-2,param2=random
Sleeping for 3
param1=1e-3,param2=random
Sleeping for 4
param1=1e-5,param2=random
Sleeping for 5
param1=1e-3,param2=ones
Sleeping for 5

Есть много других параметров и параметров:

  • parallel --dry-run ... покажет вам, что он будет делать, фактически ничего не делая

  • parallel --eta ..., что дает вам "Расчетное время прибытия"

  • parallel --bar ..., который дает вам индикатор выполнения
  • parallel -k ..., который сохраняет вывод в порядке
  • parallel -j 8 ..., который запускает 8 заданий одновременно, а не по умолчанию 1 задание на процессор core
  • parallel --pipepart ..., который разделит содержимое массивного файла по подпроцессам

Обратите внимание также, что GNU Parallel может распределять работу по другим машинам в вашей сети, и это дает сбой и повторная обработка, вывод тегов и т. д. ...

...