У меня есть сценарий, который я хотел бы разветвить в один момент, чтобы были запущены две копии одного и того же сценария.
Например, я хотел бы, чтобы существовал следующий скрипт bash:
echo $$
do_fork()
echo $$
Если этот bash-скрипт действительно существует, ожидаемый результат будет:
<ProcessA PID>
<ProcessB PID>
<ProcessA PID>
или
<ProcessA PID>
<ProcessA PID>
<ProcessB PID>
Есть ли что-то, что я могу поставить вместо do_fork (), чтобы получить такой вывод, или заставить скрипт bash выполнить C-подобный форк?
&
это вилка, нет никакого exec, вовлеченного. Fork + exec - это когда вы запускаете внешнюю команду.exec
, но два языка имеют разные потоки управления.&
запускает подоболочку, в которой выполняется данная команда. Вилка + отл. Вы не можете просто поставить&
без предшествующей команды для выполнения.&
строку самостоятельно. Но ты не можешь. Это не означает «развилка здесь». Это означает «выполнить предыдущую команду в фоновом режиме в подоболочке».Да, это называется подоболочек . Код оболочки внутри скобки запускается как подоболочка (форк). Однако первая оболочка обычно ждет завершения работы ребенка. Вы можете сделать это асинхронным, используя
&
терминатор. Посмотрите это в действии с чем-то вроде этого:$ bash subsh.sh
источник
&
это вилка одна. Если вы хотите выполнить более одного конвейера в дочернем процессе, достаточно использовать фигурные скобки (которые выполняют группировку, не создавая дочерний процесс):{ sleep 2; echo child; } &
Нет никакого собственного bash (или, насколько мне известно, любого другого типичного * nix shell) способа сделать это. Есть много способов порождать разветвленные процессы, которые делают что-то еще асинхронно, но я не думаю, что есть что-то, что следует точной семантике системного вызова fork ().
Типичный подход заключается в том, чтобы ваш скрипт верхнего уровня порождал помощников, выполняющих только ту работу, которую вы хотите разделить. Если вы делаете
$0 $@ &
или что-то еще, вы начнете с самого начала снова и вам нужно как-то это выяснить.Я на самом деле начинаю думать о нескольких умных способах, которыми можно сделать именно это ....
Но , прежде чем мой мозг слишком увлекся этим, я думаю, что довольно хорошее правило: если вы пытаетесь написать что-то в оболочке, и оно наполняется хитрыми трюками, и вы желаете больше языковых возможностей, пора переключаться на настоящий язык программирования .
источник