Mam skrypt, który chciałbym rozwidlić w pewnym momencie, więc działają dwie kopie tego samego skryptu.
Na przykład chciałbym, aby istniał następujący skrypt bash:
echo $$
do_fork()
echo $$
Jeśli ten skrypt bash naprawdę istniał, oczekiwanym wynikiem byłoby:
<ProcessA PID>
<ProcessB PID>
<ProcessA PID>
lub
<ProcessA PID>
<ProcessA PID>
<ProcessB PID>
Czy jest coś, co mogę umieścić zamiast „do_fork ()”, aby uzyskać tego rodzaju dane wyjściowe lub spowodować, że skrypt bash wykona rozwidlenie podobne do C?
&
jest widelec, nie jest zaangażowany żaden exec. Fork + exec ma miejsce po uruchomieniu zewnętrznego polecenia.exec
, ale oba języki mają różny przebieg sterowania.&
uruchamia podpowłokę, w której wykonywane jest dane polecenie. Widelec + exec. Nie można po prostu wstawić&
bez poprzedniego polecenia do wykonania.&
linię samą w sobie. Ale nie możesz. Nie oznacza to „rozwidlenia tutaj”. Oznacza to „wykonaj poprzednie polecenie w tle w podpowłoce”.Tak, to się nazywa podpowłoki . Kod powłoki w nawiasie jest uruchamiany jako podpowłoka (rozwidlenie). Jednak pierwsza skorupa zwykle czeka na ukończenie przez dziecko. Możesz ustawić go jako asynchroniczny za pomocą
&
terminatora. Zobacz to w akcji z czymś takim:$ bash subsh.sh
źródło
&
jest sam widelec. Jeśli chcesz wykonać więcej niż jeden potok w procesie potomnym, wystarczy użyć nawiasów klamrowych (które wykonują grupowanie bez tworzenia procesu potomnego):{ sleep 2; echo child; } &
Nie ma natywnego basha (lub, o ile mi wiadomo, jakiejkolwiek innej typowej powłoki * nix). Istnieje wiele sposobów na odradzanie rozwidlonych procesów, które wykonują coś innego asynchronicznie, ale nie sądzę, że istnieje coś, co podąża dokładnie za semantyką wywołania systemowego fork ().
Typowe podejście polega na tym, że skrypt najwyższego poziomu odradza pomocników wykonujących tylko tę pracę, którą chcesz rozdzielić. Jeśli to zrobisz,
$0 $@ &
cokolwiek, zaczniesz od początku i musisz to jakoś wymyślić.Właściwie zaczynam myśleć o kilku sprytnych sposobach, w jakie można to zrobić ...
Ale zanim mój mózg zostanie tym zbyt pochłonięty, myślę, że całkiem dobrą zasadą jest: jeśli próbujesz napisać coś w skorupce i zapełni się on sprytnymi sztuczkami i pragniesz więcej funkcji językowych, czas na zmianę do prawdziwego języka programowania .
źródło