2014-09-18 3 views
2

Как получить возвращаемое значение фонового процесса? Если я это сделаю, я буду получать 0Код возврата фонового процесса bash

#!/bin/bash 
SomeCommand& 
echo $? 

выход:#~0

Но если я пытаюсь

SomeCommand 
echo $? 

выход:#~255

Я прочитал, что wait, но если я сделаю это

SomeCommand$ 
wait $! 
echo $? 

Я не могу запустить следующую команду, если предыдущая команда не была выполнена.

+1

Вы не можете получить статус выхода процесса, если он все еще работает. '0' говорит, что вы успешно начали работу в фоновом режиме. –

ответ

5

wait команда ждет заданного задания background. Используйте его так:

(sleep 5; exit 4) & 
wait $! 

ret=$? 
echo $ret 
4 

$! представляет идентификатор процесса последнего фонового задания.

В вашем случае вы можете сделать:

SomeCommand & 
wait $! 
echo $? 

Чтобы запустить несколько фоновых заданий и получить их выхода из состояния позже, сохранить значение $! после запуска каждого задания.

(sleep 5; exit 4) & b1_pid=$! 
(sleep 5; exit 21) & b2_pid=$! 

# More code 

wait $b1_pid 
b1_exit=$? 
wait $b2_pid 
b2_exit=$? 
+0

Что делать, если запущено 10 фоновых процессов? Как получить коды возврата? Поскольку нет смысла запускать один фоновый процесс и ждать его. –

+0

Команда 'wait' принимает идентификатор процесса как аргумент. Вы можете использовать 'wait pid1' ИЛИ' wait pid2' и т. Д. – anubhava

+0

@chepner: Спасибо за добавление важной отредактированной части. – anubhava

0
#!/bin/bash 
    command1 & 
    commandN & 
    for job in $(jobs -p) 
    do 
     wait $job 
     echo $? 
    done 
+1

Хотя ваш код мог бы (или не работать), было бы замечательно, если бы вы добавили краткое объяснение об ошибке и как ваш код решит его. Как это не дает полного ответа в соответствии с [справочным центром] (http://stackoverflow.com/help/how-to-answer) – dic19

+0

Что делать, если есть несвязанные задания, которые были запущены перед этим скриптом? 'jobs -p' покажет их, и ваш скрипт будет ждать несвязанных заданий –

+0

Я тестирую этот скрипт на своей машине и' jobs -p' не показывает несвязанные задания –