web-dev-qa-db-fra.com

Bash Support Forking semblable à la fourchette de C ()?

J'ai un script que j'aimerais faire une fourchette à un moment donné, deux copies du même script sont en cours d'exécution.

Par exemple, j'aimerais que le script Bash suivant existe:

echo $$
do_fork()
echo $$

Si ce script Bash existait vraiment, la sortie attendue serait la suivante:

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

ou

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

Y a-t-il quelque chose que je peux mettre à la place de "do_fork ()" pour obtenir ce genre de sortie ou faire faire le script Bash comme une fourchette de type C?

26
Cory Klein

Oui. Forking est orthographié &:

echo child & echo parent

Ce qui peut vous déranger, c'est que $$ n'est pas le PID du processus de coquille, c'est le PID du processus de shell original. Le point de le faire de cette façon est que $$ est un identifiant unique pour une instance particulière du script shell: il ne change pas lors de l'exécution du script, et c'est différent de $$ Dans n'importe quel autre script en cours d'exécution. Une façon d'obtenir le PID du processus de Shell est sh -c 'echo $PPID'.

Le flux de contrôle dans la coque n'est pas le même que C. si dans C, vous écrivez

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

puis un équivalent de coque est

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

La forme de shell simple first; child & parent correspond à l'idiome C habituel

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

& et $$ Existe et se comporter de cette façon dans chaque coquille de style Bourne et dans (t) csh. $PPID n'existait pas dans la coquille d'Orignal Bourne mais est à Posix (donc c'est dans Ash, Bash, Ksh, Zsh, ...).

Il n'y a pas de bash natif (ou, à ma connaissance, toute autre solution typique * Nix Shell) de faire cela. Il y a beaucoup de façons de créer des processus fourchus qui font quelque chose d'autre de manière asynchrone, mais je ne pense pas qu'il y ait quelque chose qui suit la sémantique exacte de l'appel du système Fork ().

L'approche typique serait de disposer de votre script de haut niveau aboutit aux aides qui font exactement le travail que vous souhaitez diviser. Si tu fais $0 $@ & ou quoi que ce soit, vous commencerez à nouveau au début et devez comprendre cela en quelque sorte.

Je commence à penser à plusieurs façons intelligentes dans laquelle on pourrait faire exactement cela ....

mais, avant que mon cerveau ne soit trop emporté avec cela, je pense qu'une très bonne règle est la suivante: si vous essayez d'écrire quelque chose dans Shell et que vous obtiendrez des tours astucieux et vous souhaitez Plus de fonctionnalités de la langue, Il est temps de passer à un vrai langage de programmation .

7
mattdm