Ожидание завершения любого процесса в сценарии bash

Вот и все.Я не знал, что boot= был параметром, в отличие от исходного загрузочного каталога, содержащего initrd. Спасибо.

2
28.06.2021, 08:42
2 ответа

Хотяwait -n(на комментарий @icarus )работает в этой конкретной ситуации, следует отметить, что $!содержит PID последнего запущенного процесса. Так что вы можете проверить и это:

#!/bin/bash

find $HOME/Downloads -name "dummy" &
p1=$!
find $HOME/Downloads -name "dummy" &
p2=$!
find $HOME/Downloads -name "dummy" &
p3=$!
while true
do
    if ps $p1 > /dev/null ; then
        echo -n "p1 runs "
    else 
        echo -n "p1 ended"
    fi
    if ps $p2 > /dev/null ; then
        echo -n "p2 runs "
    else 
        echo -n "p2 ended"
    fi
    if ps $p1 > /dev/null ; then
        echo -n "p3 runs "
    else 
        echo -n "p3 ended"
    fi
    echo ''
    sleep 1
done

Но parallel— лучший вариант.

2
28.07.2021, 11:21

I am trying to check how many active processes are running in a bash script. The idea is to keep x processes running and when one finished then the next process is started.

С GNU Parallel это выглядит так:

parallel -j3 find $HOME/Downloads -name {} ::: "name1" "name2" "name3"

Если вам нужно запускать разные программы (а не просто разные аргументы):

parallel -j3 ::: "find $HOME/Downloads -name name1" "find $HOME/Downloads -name name2"  "find $HOME/Downloads -name name3" 

Если команды более сложные, используйте функции bash:

find1() {
  find $HOME/Downloads -name "name1"
}
find2() {
  find $HOME/Downloads -name "name2"
}
find3() {
  find $HOME/Downloads -name "name3"
}
export -f find1 find2 find3
parallel -j3 ::: find1 find2 find3

Если вы опустите -j3, будет выполняться одно задание на ядро ​​ЦП.

1
28.07.2021, 11:21

Теги

Похожие вопросы