Ожидайте фоновых процессов для окончания с обратным идентификатором процесса соответствия

необходимо вручную включить внутренний компоновщик в XFCE4, это не имеет никакого отношения драйверам VGA.

войти

Settings > Xfce 4 Settings Manager > Window Manager Tweaks
4
09.09.2013, 03:20
2 ответа

Как другие сказали, нет никакого способа ожидать на "не" идентификатор процесса. Однако этот шаблон кода не кажется, что плохо мне, таким образом, я предлагаю его как предложенный способ достигнуть того, что Вы после.

Это использует массивы Bash, которые можно затем дать как список к wait команда.

Пример

Измененная версия Вашего примера кода, cmd.bash.

!/bin/bash

array[0]=1
array[0]=2

sleep 30 &
pid=$!

pidArr=()
for i in ${array[@]}; do
  for n in $(seq 3); do
    if [ $n -eq 1 ]; then
      sleep 31 > file &
      pidArr+=($!)
    else
      sleep 32 >> file &
      pidArr+=($!)
    fi
  done
done

echo ${pidArr[@]}

Я занял место sleep команды в этом примере только для моделирования некоторых длительных заданий, что мы можем фон. Они не имеют никакого отношения к этому кроме действовать как заместители.

Также финал echo команда там просто, таким образом, мы видим то, что происходит, когда для циклов завершаются. В конечном счете мы заменим его фактическим wait команда, но позволяют нам не обогнать нас.

Пример выполняет № 1

Поэтому давайте запустим нашу программу и посмотрим то, что происходит.

$ ./cmd.bash 
24666 24667 24668

Теперь, если мы проверяем ps:

$ ps -eaf|grep sleep
saml     24664     1  0 22:28 pts/9    00:00:00 sleep 30
saml     24666     1  0 22:28 pts/9    00:00:00 sleep 31
saml     24667     1  0 22:28 pts/9    00:00:00 sleep 32
saml     24668     1  0 22:28 pts/9    00:00:00 sleep 32

Если мы будем ожидать немного, то они в конечном счете закончатся. Но это показывает, что, если мы добавляем идентификаторы процесса к массиву, мы можем echo их впоследствии.

Пример № 2

Поэтому давайте изменим это echo наметьте и загрузите a wait выровняйте теперь, что-то вроде этого:

  wait ${pidArr[@]}

Теперь, когда мы выполняем нашу измененную версию, мы видим, что она ожидает на ВСЕХ идентификаторах процесса:

$ ./cmd.bash 

... после передач ~30 секунд

$

Мы возвращаем нашу подсказку. Таким образом, мы успешно ожидали всех процессов. Быстрая проверка ps:

$ ps -eaf|grep sleep
$

Таким образом, это работало.

3
27.01.2020, 20:49
  • 1
    сохранил меня имеющий необходимость записать, что эссе, спасибо, :D –  Drav Sloan 09.09.2013, 13:20
  • 2
    @DravSloan - да, если я когда-нибудь оставляю комментарии всегда, не стесняются описывать это как ответ, это обычно означает, что я также устал, чтобы подробно остановиться на нем. Это обычно имеет место с большинством все также. Я ожидал несколько часов, чтобы удостовериться, что Вы не собирались делать это. 8-). –  slm♦ 09.09.2013, 15:17

Что случилось только с

wait

Как help wait примечания:

Ожидает процесса, определенного идентификатором, который может быть идентификатором процесса или спецификацией задания, и сообщает о ее состоянии завершения. Если идентификатор не дан, ожидает всех в настоящее время активных дочерних процессов, и статус возврата является нулем.

Вы хотите к, "все еще позволяют другому фоновому процессу продолжаться"? Просто disown это. Следование Вашему примеру:

command1 & disown %1
command2 & command2 & command2 &
wait
6
27.01.2020, 20:49

Теги

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