У меня есть (еще) другой wait
, &
, &&
вопрос потока управления ..
Скажем, у меня есть сценарий, похожий на этот, где я хочу выполнять как можно больше работы одновременно:
# may take some hours
something InputA > IrrelevantA &
something InputB > IrrelevantB &
# may take an hour
(
somethingElse InputA > OutputA &
somethingElse InputB > OutputB &
)&& combine OutputA OutputB > Result
...morestuff
Вопрос 1: В сценарии combine
ожидает somethingElse
завершения обоих something
процессов, пока оба процесса продолжаются?
Вопрос 2: Если нет - и я подозреваю, что нет - как мне combine
ждать только обоих somethingElse
процессов, пока something
вышеописанные процессы продолжают работать в фоновом режиме?
источник
Замена Would процесс более эффективным, особенно , если вам не нужно сохранять файлы
OutputA
иOutputB
, и заботиться только о томResult
? Будет ли это особенно экономить время, потому что если у вас медленный ввод-вывод при записи на диск, сохранение файловOutputA
иOutputB
может быть ограничивающим скорость шагом?Подстановка процессов позволяет поместить команду внутрь,
<(..here..)
а не сохранять выходные данные в файл, а затем читать их как входные данные на этапе «объединить».Если память является ограничением, а объем
outputA
и дажеoutputB
больше, чем может вместить память, победит ли она всю цель?Будет ли
combine
ждать завершения обоих процессов, прежде чем он запустится?источник
combine
начнется выполнение, как только начнутся двеsomethingElse
команды, но это нормально, потому что<(…)
все это каналы; поэтомуcombine
просто будет вынужден ждать данных, если они опережаютsomethingElse
процессы. И, поскольку они представляют собой трубы, размер не является проблемой. … (Продолжение)somethingElse
процессов - и не совсем ясно, важно ли это для автора. Но, кроме того, ответ не должен задавать такие вопросы.Вы можете использовать
wait
команду:Вы можете видеть, что «стартовая» строка происходит сразу, а «готово» ждет 10 секунд.
источник
Я на самом деле продемонстрировать , как именно такого рода вещи можно было бы сделать в другой ответ здесь . Этот ответ был на вопрос о том, что 2 журнала были сохранены в фоновом режиме, поэтому я продемонстрировал это с 10.
Демо-сценарий
Запустить демо
Вывод:
Вышесказанное демонстрирует. Он строит и запускает скрипт с именем
/tmp/script
,chmod
«S как исполняемый файл и запускает его в&background
из&backgrounded ( subshell )
.В скрипте
rms /tmp/file0-9
10 файлов иechoes
строка каждую секунду во все 10 из них. Я получаю некоторые данные$info
из процесса, который был отменен, и представляю их в виде$(command substitution). While ps
еще отчетов о$pid
захвате I, я знаю, что они все еще выполняются, поэтому я.sleep.
После завершения строки во всех 10 файлах подсчитываются сwc.
После того, как вы вызовете процесс таким способом, вы можете свободно закрыть его исходный родительский процесс, и он продолжит отправлять сообщения - он фактически откажется. Это также означает , что вы не можете использовать обычную
wait
команду, но ожиданиеps
«S возвращения должны быть более надежными в любом случае.Стоит отметить, я думаю, что этот процесс на самом деле изначально вызвал
$(command substitution)
иprintfs
мне$info
я хочу , чтобы я мог эффективно контролировать. Но как только он сбрасывает свой вывод терминала сexec 1>&2
(который закрыт в той же подоболочке с2>&-
), процесс завершается, и мне приходится ждать его на другом конце. Вроде как лучшее из обоих миров, особенно если вы используете его для обработки входных каналов, если вы можете сосредоточиться на всех перенаправлениях и лидерах процессов.Все остальное здесь просто для демонстрации. Все, что вам нужно для запуска, это верхний скрипт и:
ПРИМЕЧАНИЕ. Это выводит на терминал только то, что я хотел продемонстрировать. Как отмечено,
$PPID,
этот процесс отвергается терминалом и является прямым потомком$PID 1.
Если вы хотите запустить два из них одновременно и ждать их, вы можете просто сдать
ps
оба пида и подождать.источник