Ondersteunt bash forking vergelijkbaar met C ' s fork ()?

Ik heb een script dat ik op een bepaald punt wil splitsen, zodat er twee exemplaren van hetzelfde script worden uitgevoerd.

Bijvoorbeeld , Zou ik willen dat het volgende bash-script bestaat:

echo $$ do_fork() echo $$ 

Als dit bash-script echt zou bestaan, zou de verwachte uitvoer zijn:

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

of

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

Is er iets dat ik in plaats van “do_fork ()” kan plaatsen om dit te krijgen soort output, of om ervoor te zorgen dat het bash-script een C-achtige fork doet?

Answer

Ja. Forking wordt gespeld als &:

echo child & echo parent 

Wat voor verwarring kan zorgen is dat $$ is niet de PID van het shell-proces, het is de PID van het originele shell-proces. Het punt om het op deze manier te maken is dat $$ is een unieke identificatie voor een bepaald exemplaar van het shell-script: het verandert niet tijdens de uitvoering van het script en het is anders dan $$ in andere gelijktijdig draaiende script. Een manier om de werkelijke PID van het shellproces te krijgen is sh -c "echo $PPID".

De controlestroom in de shell is niet hetzelfde als C. Als je in C “d write

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

dan is een shell-equivalent

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

De eenvoudige shell-vorm first; child & parent komt overeen met het gebruikelijke C-idioom

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

& en $$ bestaan en gedragen zich op deze manier in elke Bourne-achtige shell en in (t) csh. $PPID bestond niet in de originele Bourne shell maar is in POSIX (dus het “is in ash, bash, ksh, zsh,…).

Reacties

  • Maar dat ' s in feite " fork + exec ", niet alleen fork.
  • @mattdm: Uh? & is fork, er zijn ' geen exec bij betrokken. Fork + exec is wanneer je een extern commando start.
  • @mattdm: Ah, ik denk dat ik wat zie Cory komt eraan. Daar ' is er geen exec, maar de twee talen hebben een verschillende control flow.
  • @Gilles: The bash control operator & start een subshell waarin het gegeven commando wordt uitgevoerd. Vork + exec. Je kunt ' t gewoon & plaatsen zonder voorafgaande opdracht om uit te voeren.
  • Nou, als " Forking is gespeld & " waren een echte uitspraak, je zou op een aparte regel. Maar je kunt ' t. Het betekent niet ' niet " splitsing hier ". Het betekent dat " het voorgaande commando op de achtergrond uitvoert in een subshell ".

Answer

Ja, het “heet subshells . Shell-code tussen haakjes wordt uitgevoerd als een subshell (fork). De eerste shell wacht echter normaal tot het kind klaar is. Je kunt het asynchroon maken met de & terminator. Zie het in actie met zoiets als dit:

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

$ bash subsh.sh

Reacties

  • De haakjes creëren een subshell , maar dat ' s fork + wait. & is alleen een fork. Als u meer dan één pijplijn in het onderliggende proces wilt uitvoeren, het ' is voldoende om accolades te gebruiken (die groeperen zonder een onderliggend proces te creëren): { sleep 2; echo child; } &

Answer

Er is geen native bash (of, voor zover ik weet, een andere typische * nix shell) manier om dit te doen. Er zijn veel manieren om gevorkte processen te produceren die iets anders asynchroon doen, maar ik denk niet dat er iets is dat de exacte semantiek van de systeemaanroep fork () volgt.

De typische benadering zou zijn om je script op het hoogste niveau te laten voortkomen uit helpers die precies het werk doen dat je wilt opsplitsen. Als je $0 $@ & of wat dan ook doet, begin je weer bij het begin en moet je zoek dat op de een of andere manier uit.

Ik “begin eigenlijk verschillende slimme manieren te bedenken om precies dat te doen …

Maar , voordat mijn brein zich daar te veel door laat meeslepen, denk ik dat een vrij goede regel is: als je iets in de shell probeert te schrijven en het wordt vol slimme trucs en je wenst meer taalfuncties, tijd om over te schakelen naar een echte programmeertaal .

Reacties

  • Hoewel je punt goed is begrepen, bash ' s syntaxis is aantoonbaar moeilijk en ' ontbreekt de elegantere datastructuren en kenmerken van Perl of Python, bash is zo echt als het kan- in zijn domein . Het is een domeinspecifieke taal en ik zou in veel gevallen zelfs beter (beknopter, eenvoudiger) beweren dan bijvoorbeeld Python. Kunt u een kamer vol systemen beheren en Python niet kennen? Ja. Kun je dat doen en geen flauwekul weten [programmeren]? Ik zou ' niet willen proberen. Na 30 jaar shellprogrammering zeg ik je dat het ' zo echt is als het kan. En ja, ik spreek Python. Maar breng ' de jongeren niet in verwarring.
  • Dat gezegd hebbende, technisch vind ik dit antwoord meer leuk. Zeggen dat " & " het antwoord is voor de gebruiker ' s vraag, " splitsing op een bepaald punt zodat twee exemplaren van hetzelfde script worden uitgevoerd " is voor mijn geest verwarrend. Wat " & " doet, is volgens de bash-handleiding " … voert het [gegeven] commando op de achtergrond uit in een subshell. " Het moet een commando beëindigen en er is wel een vork bij betrokken (technisch , in Linux, een kloon ()), maar op dat moment draaien twee exemplaren van hetzelfde script niet.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *