Как запустить сценарий фоновой оболочки, который сам запускает два фоновых процесса?

Начнем с того, что я новичок в программировании и т. д., поэтому прошу прощения за отсутствие профессионально точной терминологии в моем вопросе, но, надеюсь, мне удастся донести свою точку зрения!

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

Я написал сценарий оболочки (для bash), чтобы применить фильтр изображения к каждому кадру короткого, но тяжелого видеоклипа (на самом деле это научная томограмма, но это не имеет большого значения). Предполагается:

  1. Создайте файл со сценарием для преобразования всего файла в другой формат с помощью программного обеспечения em2em.

  2. Разделите преобразованный файл на три равные части и отфильтруйте каждый набор кадров в отдельном процессе на отдельных ядрах на моем Linux-сервере (для ускорения работы) с помощью программы-паука. Сначала создаются три файла пакетного режима (filter_1/2/3.spi) с необходимыми параметрами фильтрации, после чего запускаются три подпроцесса:

    spider spi/spd @filter_1 &  # The first process to be launched by the main script and run in the background on one core
    spider spi/spd @filter_2 &  # The second background process run on the next core
    spider spi/spd @filter_3    # The third process to be run in parallel with the two above and be finished before proceeding further.
    

    Затем эти отфильтрованные фрагменты объединяются в конце.

Поскольку я хотел, чтобы 3 шага фильтрации выполнялись одновременно, я отправил первые два в фоновый режим с помощью простого & и оставил последний на переднем плане, так что основной процесс сценария будет ждать завершения всех трех шагов (должно происходить одновременно). время), прежде чем приступить к повторной сборке 3 кусков. Все это прекрасно работает, когда я запускаю свой скрипт на переднем плане, но он выводит на терминал много выходной информации из множества подпроцессов. Я могу уменьшить его с помощью:

$ ./My_script 2>&1 > /dev/null

Но каждый процесс паука все еще возвращается

*****Spider normal stop*****

к терминалу. Когда я пытаюсь отправить основной процесс в фоновый режим, он все время останавливается.

У вас есть какие-либо предложения, как я могу запустить основной скрипт в фоновом режиме и все же заставить его каким-то образом запускать 3 подпроцесса паука параллельно?

Спасибо!


person kener    schedule 07.10.2013    source источник
comment
Вместо ./My_script 2>&1 > /dev/null, который направляет stdout на /dev/null, а stderr — на исходный stdout (tty, в котором вы вводите команду), попробуйте перенаправить оба на /dev/null с помощью ./My_script > /dev/null 2>&1. Порядок имеет значение.   -  person William Pursell    schedule 07.10.2013


Ответы (2)


Вы можете запускать каждого паука в фоновом режиме, сохраняя идентификаторы процессов, которые впоследствии можно использовать в команде wait, например:

spider spi/spd @filter_1 &
sp1=$!
spider spi/spd @filter_2 &
sp2=$!
spider spi/spd @filter_3 &
sp3=$!
wait $sp1 $sp2 $sp3

Если вы хотите избавиться от вывода, примените перенаправления к каждой команде.

Обновление: на самом деле вам даже не нужно хранить PID, wait без параметров будет автоматически ждать всех порожденных дочерних элементов.

person Jester    schedule 07.10.2013

Во-первых, если вы используете bash, вы можете использовать wait для ожидания завершения каждого процесса. Например, все сообщения будут напечатаны только после завершения всех процессов:

sleep 10 &
P1=$!
sleep 5 &
P2=$!
sleep 6 &
P3=$!

wait $P1
echo "P1 finished"
wait $P2
echo "P2 finished"
wait $P3
echo "P3 finished"

Вы можете использовать ту же идею, чтобы дождаться завершения spider процессов и только затем объединить результаты.

Что касается вывода, вы можете попробовать перенаправить каждый на /dev/null вместо перенаправления всего вывода скрипта:

sleep 10 &> /dev/null &
person Salem    schedule 07.10.2013