Bash supporta il fork in modo simile a C ' s fork ()?

Ho uno script che vorrei fare a un certo punto in modo che siano in esecuzione due copie dello stesso script.

Ad esempio , Vorrei che esistesse il seguente script bash:

echo $$ do_fork() echo $$ 

Se questo script bash esistesse veramente, loutput atteso sarebbe:

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

o

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

Cè qualcosa che posso mettere al posto di “do_fork ()” per ottenerlo tipo di output, o per far sì che lo script bash esegua un fork simile a C?

Answer

Sì. Il fork è scritto &:

echo child & echo parent 

Ciò che potrebbe creare confusione è che $$ non è il PID del processo di shell, è il PID del processo di shell originale . Il punto di farlo in questo modo è che $$ è un identificatore univoco per una particolare istanza dello script di shell: non cambia durante lesecuzione dello script ed è diverso da $$ in qualsiasi altro in esecuzione contemporaneamente script. Un modo per ottenere il PID effettivo del processo di shell è sh -c "echo $PPID".

Il flusso di controllo nella shell non è lo stesso di C. Se in C si “d write

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

allora un equivalente di shell è

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

La semplice forma di shell first; child & parent corrisponde al solito linguaggio C

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

& e $$ esiste e si comporta in questo modo in ogni shell in stile Bourne e in (t) csh. $PPID non esisteva nella Bourne originale shell ma è in POSIX (quindi è in ash, bash, ksh, zsh, …).

Commenti

  • Ma questo ' è fondamentalmente " fork + exec ", non solo fork.
  • @mattdm: Uh? & è fork, ' non è coinvolto alcun exec. Fork + exec è quando avvii un comando esterno.
  • @mattdm: Ah, penso di aver visto cosa Cory sta arrivando. ' non cè exec, ma le due lingue hanno un flusso di controllo diverso.
  • @Gilles: The bash control operator & avvia una subshell in cui viene eseguito il comando dato. Fork + exec. Non puoi ' mettere & senza alcun comando precedente da eseguire.
  • Bene, se " Forking è scritto & " se fosse una dichiarazione vera, potresti mettere & su una riga da solo. Ma puoi ' t. Non ' significa " fork qui ". Significa che " esegue il comando precedente in background in una subshell ".

Risposta

Sì, si chiama subshell . Il codice della shell tra parentesi viene eseguito come subshell (fork). Tuttavia, la prima shell normalmente attende il completamento del bambino. Puoi renderla asincrona utilizzando il terminatore &. Guardala in azione con qualcosa del genere:

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

$ bash subsh.sh

Commenti

  • Le parentesi creano una subshell , ma quel ' fork + wait. & è solo fork. Se desideri eseguire più di una pipeline nel processo figlio, ' è sufficiente utilizzare le parentesi graffe (che eseguono il raggruppamento senza creare un processo figlio): { sleep 2; echo child; } &

Risposta

Non esiste un nativo bash (o, per quanto ne so, qualsiasi altra tipica shell * nix) per farlo. Ci sono molti modi per generare processi fork che fanno qualcosaltro in modo asincrono, ma non credo che ci sia qualcosa che segua la semantica esatta della chiamata di sistema fork ().

Lapproccio tipico sarebbe essere quello di fare in modo che il tuo script di primo livello generi aiutanti che fanno solo il lavoro che vuoi dividere. Se fai $0 $@ & o qualsiasi altra cosa, ricomincerai dallinizio e dovrai capirlo in qualche modo.

In realtà sto iniziando a pensare a diversi modi intelligenti in cui si potrebbe fare proprio questo ….

Ma , prima che il mio cervello si lasci trasportare troppo, penso che una regola abbastanza buona sia: se stai provando a scrivere qualcosa in shell e sta ottenendo pieno di trucchi intelligenti e “desideri più funzioni linguistiche, è ora di passare a un vero linguaggio di programmazione .”

Commenti

  • Sebbene il tuo punto di vista sia ben accolto, la sintassi di bash ' è discutibilmente difficile e ' s che mancano le strutture dati e le caratteristiche più eleganti di Perl o Python, bash è reale come si ottiene – nel suo dominio . È un linguaggio specifico del dominio e direi anche meglio (più succinto, più semplice), ad esempio, di Python in molti casi. Puoi amministrare una stanza piena di sistemi e non conosci Python? Sì. Puoi farlo e non conoscere un po di bash [programmazione]? ' non vorrei provare. Dopo 30 anni di programmazione della shell ti dico che ' è reale come sembra. E sì, parlo Python. Ma non ' confondere i giovani.
  • Detto questo, tecnicamente questa risposta mi piace di più. Dire che " & " è la risposta per lutente ' s domanda, " fork a un certo punto in modo che due copie dello stesso script siano in esecuzione " è al mio mente confusa. Ciò che " & " fa, secondo il manuale di bash, è " … esegue il comando [dato] in background in una subshell. " Deve terminare un comando e coinvolge un fork (tecnicamente , in Linux, un clone ()), ma a quel punto non sono in esecuzione due copie dello stesso script.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *