2016-12-23 3 views
0

У меня есть сценарий bash, в котором я хочу запускать некоторые несвязанные команды в разветвленных процессах. Эти команды должны выполняться только в разветвленном процессе, а другие команды должны выполняться только в родительском.Bash forking the subshell

echo "I am parent statement 1" 
(echo "I am child statement 1"; echo "I am child statement 2"; sleep 30) & 
echo "I am parent statement 2" 

В этом примере будет родительская оболочка выводить только оператор «родителя», и ребенок эхо только 'ребенок заявления? Или ребенок будет возвращать родительский оператор 2 после возвращения?

Также, родитель будет ждать ребенка (делать сон 30)? Или родительский выход и ребенок продолжат работать в течение 30 секунд?

+4

Почему бы вам не запустить его и не увидеть? Вы можете легко добавить pid в каждое эхо, чтобы увидеть, какой процесс его испускает. – kaylum

+0

Я пробовал - но не понятно, из какого вывода выводится какая-то оболочка. и я не уверен, как отправить какой-то вывод в одно окно, а некоторые в другое – TSG

+0

'echo" $$: Я являюсь родительским выражением 2 ". Это будет использоваться с pid, который поможет вам легко определить, откуда он. – kaylum

ответ

0

Каждый процесс будет запускать только свои собственные заявления.

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

#!/bin/bash 

echo "I am parent statement 1" 
(echo "I am child statement 1"; echo "I am child statement 2"; sleep 30) & 
jobs -l 
echo "I am parent statement 2" 
echo $$ 

Если вы запустите скрипт, а затем сделать ps aux | grep <pid> для обоих родителей и ребенка, вы увидите, что родитель умер, когда ребенок живет.

+0

Это не относится к коду, который вы показываете, но обратите внимание, что '$$' в подоболочке (дочерний процесс в bash) * faked *. Вы можете увидеть эффект с помощью '(echo $$; ps)', с или без хвоста '&'. – cdarke