2012-06-28 4 views
7

Я следующий Баш скрипт, мы можем назвать его script1.sh:Как проверить, жив ли фоновая работа? (Баш)

#!/bin/bash 

exec ./script2.sh & 

sleep 5 

if job1 is alive then #<--- this line is pseudo-code! 
    exec ./script3.sh & 
    wait 
fi 

Как можно видеть, сценарий выполняет script2.sh в качестве фонового задания, а затем ждет 5 секунд (так script2.sh может сделать некоторые инициализации материал). Если инициализация завершается успешно, то задание script2.sh все равно будет живым, и в этом случае я также хочу запустить script3.sh одновременно; если нет, я просто хочу уйти.

Однако я не знаю, как проверить, жива ли первая работа, а следовательно, строка псевдокода. Итак, что должно быть на его месте?

+2

Запуск exec не будет делать то, что вы думаете. Он заменит текущий процесс новым процессом; более поздние строки в вашем скрипте не будут достигнуты. –

ответ

9

Вы можете получить PID из последних фоновых заданий с помощью $!. Затем вы можете проверить статус выхода ps, чтобы определить, находится ли этот конкретный PID в списке процессов. Например:

sleep 30 & 
if ps -p $! >&-; then 
    wait $! 
else 
    jobs 
fi 
+2

Эта точная команда дает мне ошибку ps: write error: Bad Filedescriptor – FORTRAN

+0

Это не всегда работает. Например, в Alpine Linux по умолчанию «ps» привязан к BusyBox, который не поддерживает -p-переключатель. Использование 'bash' встроенных функций, таких как' jobs', более переносимо. –

3

Я не уверен, что Exec работает с фоном, так как он заменяет образ родительского процесса с тем, что дочерним процессом, в противном случае, если мы предположим, вы избавитесь от Exec, вы хотите что-то вроде:

#!/bin/bash 
./script2.sh& 
pid1=$! 

if kill -0 $pid1; then 
    ./script3.sh& 
    pid3=$! 
    wait 
fi 
6

Вы можете проверить, если сигнал доставке

./script2 & 
myPid=$! 
sleep 5 

if kill -0 "$myPid"; then 
    script3 & 
    wait 
fi 
0

Посмотрите на команду jobs; он перечисляет все текущие задания.

4

Чтобы расширить ответ fduff в вы можете использовать jobs встроенную команду:

if jobs %% 
    exec ./script3.sh & 
    wait 
fi 

jobs %% печатает задание ID самого последнего фонового процесса («текущей работы») и возвращает 0 на успех или 1, если такой работы нет.

Смежные вопросы