Слушайте код выхода фонового процесса в MakeFile

Решено Мне нужно создать фоновые процессы в MakeFile, а также учесть их коды выхода. Сценарий:

  • несколько процессов порождаются в фоновом режиме.
  • MakeFile продолжает оценку (и не хочет проверять PID порожденных процессов в каком-то цикле и т. д.)
  • Некоторый процесс завершается с ненулевым кодом выхода
  • сделать выход утилиты с ненулевым кодом выхода

Естественно, я думаю использовать command & для запуска процесса в фоновом режиме.

Проблема: если команда указана как command &, то процесс make не отслеживает свой код выхода.

Пример 1

do:
        @false & \
        echo "all is normal"


%make -f exit_status_test.mk
all is normal

Пример 2

do:
        @false && \
        echo "all is normal"


%make -f exit_status_test.mk
*** Error code 1

Stop in /usr/home/scher/tmp/lock_testing.

Пример 1 показывает, что утилита make не учитывает код завершения фонового процесса.

P.S. Пожалуйста, не советуйте хранить PID порожденных процессов и проверять их в цикле с некоторой задержкой sleep и т.д. Необходимо продолжить оценку MakeFile и автоматически выйти с ненулевым кодом.

Решение

do:
        @(echo "background command" ; (echo "[HANDLER] Prev command exits with $$?")) & \
        echo "doing something"

Таким образом, мы можем создать последовательность команд для обработки статуса завершения фонового процесса.


person scherka    schedule 16.05.2012    source источник


Ответы (1)


Это кажется непродуманной попыткой создать Makefile, который может выполнять несколько заданий параллельно, хотя на самом деле make обычно может сделать это за вас.

Все, что вам нужно сделать, это дать каждому заданию отдельную команду в make:

target: job1 job2

job1:
    some_command

job2:
    some_other_command

Если вы используете что-то подобное в своем Makefile, а затем запускаете make -j2 target, то и some_command, и some_other_command будут выполняться параллельно.

Посмотрите, сможете ли вы найти способ заставить make выполнять вашу работу параллельно, как здесь.

person Michael Slade    schedule 16.05.2012
comment
Я предполагаю, что это не подходит для MakeFile, с которым я работаю, поскольку это bsd.port.mk из коллекции портов FreeBSD. Во всех руководствах указано, что с параметрами -j они должны быть максимально точными, и чтобы написать, что вы делаете файл совместимым с этим параметром. - person scherka; 17.05.2012