Tengo un script que me gustaría bifurcar en un punto para que se estén ejecutando dos copias del mismo script.
Por ejemplo , Me gustaría que existiera el siguiente script bash:
echo $$ do_fork() echo $$
Si este script bash realmente existiera, el resultado esperado sería:
<ProcessA PID> <ProcessB PID> <ProcessA PID>
o
<ProcessA PID> <ProcessA PID> <ProcessB PID>
¿Hay algo que pueda poner en lugar de «do_fork ()» para obtener esto? tipo de salida, o hacer que el script bash haga una bifurcación similar a C?
Respuesta
Sí. La bifurcación se escribe &
:
echo child & echo parent
Lo que puede confundirte es que $$
no es el PID del proceso de shell, es el PID del proceso de shell original . El objetivo de hacerlo de esta manera es que $$
es un identificador único para una instancia particular del script de shell: no cambia durante la ejecución del script, y es diferente de $$
en cualquier otra ejecución simultánea texto. Una forma de obtener el PID real del proceso de shell es sh -c "echo $PPID"
.
El flujo de control en el shell no es el mismo que C. Si en C «d write
first(); fork(); second(); third();
entonces un shell equivalente es
after_fork () { second; third; } first; after_fork & after_fork
La forma de shell simple first; child & parent
corresponde al lenguaje habitual en C
first(); if (fork()) parent(); else child();
&
y $$
existen y se comportan de esta manera en cada shell estilo Bourne y en (t) csh. $PPID
no existía en el Bourne original shell pero está en POSIX (por lo que «está en ash, bash, ksh, zsh,…).
Comentarios
- Pero eso ' s básicamente " fork + exec ", no solo fork.
- @mattdm: ¿Uh?
&
es una bifurcación, ' no hay ningún ejecutivo involucrado. Bifurcación + ejecutivo es cuando se lanza un comando externo. - @mattdm: Ah, creo que veo lo que Cory se está acercando. No hay ' no
exec
, pero los dos idiomas tienen un flujo de control diferente. - @Gilles: El bash El operador de control
&
inicia una subcapa en la que se ejecuta el comando dado. Fork + ejecutivo. Puede ' simplemente poner&
sin un comando anterior para ejecutar. - Bueno, si " La bifurcación se escribe & " si fuera una afirmación verdadera, podría poner
&
en una línea por sí misma. Pero puedes ' t. No ' t significa " bifurcar aquí ". Significa que " ejecute el comando anterior en segundo plano en un subshell ".
Respuesta
Sí, se «llama subcapas . El código de shell entre paréntesis se ejecuta como subshell (fork). Sin embargo, el primer shell normalmente espera a que el niño se complete. Puedes hacerlo asincrónico usando el terminador &
. Míralo en acción con algo como esto:
#!/bin/bash (sleep 2; echo "subsh 1")& echo "topsh"
$ bash subsh.sh
Comentarios
Respuesta
No hay nativos bash (o, que yo sepa, cualquier otra forma típica de * nix shell) de hacer esto. Hay muchas formas de generar procesos bifurcados que hacen otra cosa de forma asincrónica, pero no creo que haya nada que siga la semántica exacta de la llamada al sistema fork ().
El enfoque típico sería ser que tu script de nivel superior genere ayudantes que hagan exactamente el trabajo que quieres dividir. Si haces $0 $@ &
o lo que sea, empezarás desde el principio de nuevo y necesitarás averígüelo de alguna manera.
De hecho, estoy empezando a pensar en varias formas ingeniosas en las que uno podría hacer eso …
Pero , antes de que mi cerebro se deje llevar por eso, creo que una regla bastante buena es: si estás tratando de escribir algo en shell y se está poniendo lleno de trucos ingeniosos y desea tener más funciones de lenguaje, tiempo para cambiar a un lenguaje de programación real .
Comentarios
- Aunque su punto está bien interpretado, la sintaxis de bash ' es posiblemente difícil y ' s faltan las estructuras de datos y las características más elegantes de Perl o Python, bash es tan real como es posible, en su dominio . Es un lenguaje de dominio específico, y yo diría que es incluso mejor (más sucinto, más simple) que, por ejemplo, Python en muchos casos. ¿Puedes administrar una sala llena de sistemas y no conocer Python? Si. ¿Puedes hacer eso y no saber ni una pizca de bash [programación]? No ' querría intentarlo. Después de 30 años de programación en shell, les digo que ' es tan real como parece. Y sí, hablo Python. Pero no ' no confunda a los jóvenes.
- Dicho esto, técnicamente me gusta más esta respuesta. Decir que " & " es la respuesta para el usuario ' s pregunta, " bifurca en un punto para que se ejecuten dos copias del mismo script " es para mi mente confusa. Lo que hace " & ", de acuerdo con el manual de bash, es " … ejecuta el comando [dado] en segundo plano en un subshell. " Debe terminar un comando, e implica una bifurcación (técnicamente , en Linux, un clon ()), pero en ese momento no se están ejecutando dos copias del mismo script.
&
es solo fork. Si desea ejecutar más de una canalización en el proceso secundario, es ' s suficiente para usar llaves (que realizan agrupaciones sin crear un proceso hijo):{ sleep 2; echo child; } &