Podporuje bash forking podobně jako C ' s fork ()?

Mám skript, který bych chtěl v určitém okamžiku rozvětvit, takže běží dvě kopie stejného skriptu.

Například Chtěl bych, aby existoval následující bash skript:

echo $$ do_fork() echo $$ 

Pokud tento bash skript skutečně existoval, očekávaný výstup by byl:

<ProcessA PID> <ProcessB PID> <ProcessA PID> 

nebo

<ProcessA PID> <ProcessA PID> <ProcessB PID> 

Je něco, co bych mohl použít místo „do_fork ()“, abych to získal druh výstupu, nebo způsobit, že bash skript provede vidlici typu C?

Odpovědět

Ano. Vidlice je napsána &:

echo child & echo parent 

Možná vás matou, že $$ není PID procesu shellu, je to PID původního procesu shellu. Smyslem tohoto postupu je, že $$ je jedinečný identifikátor pro konkrétní instanci shellového skriptu: během provádění skriptu se nemění a liší se od $$ v jakémkoli jiném současně běžícím skript. Jedním ze způsobů, jak získat skutečné PID procesu prostředí, je sh -c "echo $PPID".

Tok řízení v prostředí není stejný jako C. Pokud v C „d write

first(); fork(); second(); third(); 

pak ekvivalent prostředí je

after_fork () { second; third; } first; after_fork & after_fork 

Jednoduchý formulář prostředí first; child & parent odpovídá obvyklému C idiomu

first(); if (fork()) parent(); else child(); 

& a $$ existují a chovají se tímto způsobem v každém shellu ve stylu Bourne a v (t) csh. $PPID v orignální Bourne neexistoval shell, ale je v POSIXu (takže je to v ash, bash, ksh, zsh, …).

Komentáře

  • Ale to ' s v podstatě " vidlice + exec ", nejen vidlice.
  • @mattdm: Uh? & je vidlice, ' není zahrnut žádný exec. Fork + exec je při spuštění externího příkazu.
  • @mattdm: Ah, myslím, že vidím co Cory je na tom. ' není exec, ale oba jazyky mají odlišný tok řízení.
  • @Gilles: The bash řídící operátor & spustí subshell, ve kterém je spuštěn daný příkaz. Vidlice + vykon. Nelze ' jednoduše vložit & bez předchozího příkazu k provedení.
  • No, pokud " Vidlice je napsána & " byla pravdivá tvrzení, můžete na řádku sám o sobě. Ale nemůžete ' t. Neznamená to ' to " vidlice zde ". To znamená " provést předchozí příkaz na pozadí v subshellu ".

Odpověď

Ano, jmenuje se podškrty . Kód prostředí v závorkách je spuštěn jako subshell (fork). První shell však normálně čeká na dokončení dítěte. Můžete jej vytvořit asynchronní pomocí terminátoru &. Podívejte se na něj v akci s něčím podobným:

#!/bin/bash (sleep 2; echo "subsh 1")& echo "topsh" 

$ bash subsh.sh

Komentáře

  • Závorky vytvářejí subshell , ale to ' s fork + wait. & je pouze fork. Pokud chcete v podřízeném procesu spustit více než jeden kanál, ' stačí k použití složených závorek (které seskupují bez vytváření podřízeného procesu): { sleep 2; echo child; } &

Odpověď

Neexistuje žádný nativní bash (nebo, pokud vím, jakýkoli jiný typický * nix shell) způsob, jak toho dosáhnout. Existuje mnoho způsobů, jak rozmnožovat vidlicové procesy, které dělají něco jiného asynchronně, ale nemyslím si, že existuje něco, co by následovalo přesnou sémantiku systémového volání fork ().

Typický přístup by mít svůj skript nejvyšší úrovně rozmístit pomocníky, kteří dělají jen práci, kterou chcete rozdělit. Pokud uděláte $0 $@ & nebo cokoli jiného, začnete znovu od začátku a budete muset nějak na to přijít.

Ve skutečnosti začínám uvažovat o několika chytrých způsobech, jak by se to dalo udělat …

Ale , než se tím můj mozek příliš unese, myslím, že docela dobré pravidlo je: pokud se snažíte něco napsat do shellu a začíná plný chytrých triků a vy si přejete více jazykových funkcí, čas přejít na skutečný programovací jazyk .

Komentáře

  • Ačkoli je váš názor dobře přijat – syntaxe bash ' je pravděpodobně obtížná a je ' chybí elegantnější datové struktury a vlastnosti Perlu nebo Pythonu, bash je stejně skutečný, jak se stává – ve své doméně . Je to jazyk specifický pro doménu a já bych v mnoha případech tvrdil, že je ještě lepší (stručnější a jednodušší) než např. Python. Můžete spravovat místnost plnou systémů a neznáte Python? Ano. Dokážete to a neznáte lízání bash [programování]? Nechci ' to zkusit. Po 30 letech programování prostředí vám říkám, že je to ' tak skutečné, jak to jen jde. A ano, mluvím Pythonem. Ale nedělejte ' mátou mládež.
  • To znamená, technicky se mi tato odpověď líbí víc. Říci, že " & " je odpovědí pro uživatele ' s otázka, " vidlice v jednom okamžiku, takže běží dvě kopie stejného skriptu " je pro mě mysl matoucí. Co " & " podle bash manuálu dělá, je " … provede příkaz [daný] na pozadí v subshellu. " Musí ukončit příkaz a zahrnuje vidličku (technicky , v Linuxu, clone ()), ale v tom okamžiku nejsou spuštěny dvě kopie stejného skriptu.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *